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.