Reputation: 1729
On each index view page which contain list, I'm using ASP.NET MVC AJAX to sort and filter the list. The list is in the partial view. Everything looks so fine until I have a view with a parameter (reference key/FK)
I don't add any routes, just using the default route:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
so the url is http://localhost:49458/TimeKeeper/New?billingID=7
. If the url in that format, the AJAX sort and filter are not working. I tried to add a new route:
routes.MapRoute(
name: "TimeKeeperNew",
url: "TimeKeeper/New/{billingID}",
defaults: new { controller = "TimeKeeper", action = "New", billingID = "" }
);
so the url become: http://localhost:49458/TimeKeeper/New/7
.
Now, the ajax sort and filter are working.
Is there anyone can explain me, what's the problem? Did I use the correct way (by adding a new route) or is there any other way?
Upvotes: 0
Views: 315
Reputation: 54628
I don't even understand why you are saying primary key as MVC has no concept of this.
With only (assuming for the duration of this answer until the break):
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
Any route that does not define id
will be appended to the url with the value.
Url.Action("New", "TimeKeeper", new { billingID = 7 })
Always will produce
http://localhost:49458/TimeKeeper/New?billingID=7
Because "billingID" != "id"
So your options are another MapRoute
which I would not recommend, or use Id
:
Url.Action("New", "TimeKeeper", new { id = 7 })
which always produces:
http://localhost:49458/TimeKeeper/New/7
Optionally:
public class TimerKeeperController
{
public ActionResult New(string id)
{
int billingId;
if (!string.TryParse(id, out billingId)
{
return RedirectToAction("BadBillingId")
}
....
}
}
BREAK
What about if there are 2 parameters, let's say billingID and clientGroupID? I don't quite understand routing in depth, could you help me to explain this in the answer?
Now you need another MapRoute:
routes.MapRoute(
name: "Default2",
url: "{controller}/{action}/{id}/{id2}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional,
{id2} = UrlParameter.Optional }
);
And it is required to be before or after the previous MapRoute because anything that would work for this route will work for the previous route, thus this route will never be called. I can't exactly remember which way it goes at the moment, but if you test it, you'll figure it out quickly.
Then you can have:
http://localhost:49458/TimeKeeper/Copy/7/8
with:
public ActionResult Copy(string id, string id2)
{
....
}
notes
Yes you don't have to use a string and parse the values, you could use constraints on the MapRoute or just use Int and throw errors if someone manually types http://localhost:49458/TimeKeeper/New/Bacon
.
Upvotes: 2