在包含列表的每个索引视图页面上,我使用ASP.NET MVC AJAX对列表进行排序和筛选。该列表位于部分视图中。一切都看起来很好,直到我有一个参数(参考键/ FK)的视图
我不添加任何路线,只使用默认路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
所以网址为http://localhost:49458/TimeKeeper/New?billingID=7
。如果该格式的url,AJAX排序和过滤器不起作用。我试图添加一条新路线:
routes.MapRoute(
name: "TimeKeeperNew",
url: "TimeKeeper/New/{billingID}",
defaults: new { controller = "TimeKeeper", action = "New", billingID = "" }
);
所以网址变为:http://localhost:49458/TimeKeeper/New/7
。
现在,ajax排序和过滤器正在运行。
有没有人可以解释我,有什么问题?我是否使用了正确的方式(通过添加新路线)还是有其他方式吗?
答案 0 :(得分:2)
我甚至不明白你为什么说主键,因为MVC没有这个概念。
只有(假设这个答案的持续时间直到休息时间):
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
任何未定义id
的路线都会附加到带有值的网址。
Url.Action("New", "TimeKeeper", new { billingID = 7 })
始终会产生
http://localhost:49458/TimeKeeper/New?billingID=7
因为"billingID" != "id"
所以您的选项是我不推荐的另一个MapRoute
,或使用Id
:
Url.Action("New", "TimeKeeper", new { id = 7 })
总是产生的:
http://localhost:49458/TimeKeeper/New/7
任选地:
public class TimerKeeperController
{
public ActionResult New(string id)
{
int billingId;
if (!string.TryParse(id, out billingId)
{
return RedirectToAction("BadBillingId")
}
....
}
}
<强> BREAK 强>
如果有2个参数,那么假设为billingID和clientGroupID?我不太了解路线的深度,你能帮我在答案中解释一下吗?
现在你需要另一个MapRoute:
routes.MapRoute(
name: "Default2",
url: "{controller}/{action}/{id}/{id2}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional,
{id2} = UrlParameter.Optional }
);
需要在之前的MapRoute 之前或之后,因为任何适用于此路线的内容都适用于上一个路线,因此永远不会调用此路线。我不能完全记住它目前的方式,但如果你测试它,你会很快发现它。
然后你可以:
http://localhost:49458/TimeKeeper/Copy/7/8
使用:
public ActionResult Copy(string id, string id2)
{
....
}
备注强>
是的,您不必使用字符串并解析值,您可以在MapRoute上使用约束,或者如果有人手动键入http://localhost:49458/TimeKeeper/New/Bacon
,则只使用Int并抛出错误。