Ajax 排序和筛选在 MVC 中不起作用
Ajax Sorting and Filtering Is Not Working in MVC
在每个包含列表的索引视图页面上,我使用 ASP.NET MVC AJAX 对列表进行排序和过滤。该列表位于局部视图中。一切看起来都很好,直到我有一个带参数的视图(参考 key/FK)
我没有添加任何路由,只是使用默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
所以 url 是 http://localhost:49458/TimeKeeper/New?billingID=7
。如果 url 采用该格式,则 AJAX 排序和筛选器不起作用。我尝试添加一条新路线:
routes.MapRoute(
name: "TimeKeeperNew",
url: "TimeKeeper/New/{billingID}",
defaults: new { controller = "TimeKeeper", action = "New", billingID = "" }
);
所以 url 变成:http://localhost:49458/TimeKeeper/New/7
。
现在,ajax 排序和过滤器正在运行。
有没有人可以解释一下,这是什么问题?我使用的方法是否正确(通过添加新路线)还是有其他方法?
我什至不明白你为什么要说主键,因为 MVC 没有这个概念。
只有(假设在这个答案的持续时间内直到休息):
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
任何未定义 id
的路由都将附加到具有值的 url。
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")
}
....
}
}
中断
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?
现在你需要另一个 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 上使用约束,或者仅使用 Int 并在有人手动输入时抛出错误 http://localhost:49458/TimeKeeper/New/Bacon
.
在每个包含列表的索引视图页面上,我使用 ASP.NET MVC AJAX 对列表进行排序和过滤。该列表位于局部视图中。一切看起来都很好,直到我有一个带参数的视图(参考 key/FK)
我没有添加任何路由,只是使用默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
所以 url 是 http://localhost:49458/TimeKeeper/New?billingID=7
。如果 url 采用该格式,则 AJAX 排序和筛选器不起作用。我尝试添加一条新路线:
routes.MapRoute(
name: "TimeKeeperNew",
url: "TimeKeeper/New/{billingID}",
defaults: new { controller = "TimeKeeper", action = "New", billingID = "" }
);
所以 url 变成:http://localhost:49458/TimeKeeper/New/7
。
现在,ajax 排序和过滤器正在运行。
有没有人可以解释一下,这是什么问题?我使用的方法是否正确(通过添加新路线)还是有其他方法?
我什至不明白你为什么要说主键,因为 MVC 没有这个概念。
只有(假设在这个答案的持续时间内直到休息):
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
任何未定义 id
的路由都将附加到具有值的 url。
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")
}
....
}
}
中断
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?
现在你需要另一个 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 上使用约束,或者仅使用 Int 并在有人手动输入时抛出错误 http://localhost:49458/TimeKeeper/New/Bacon
.