Ajax排序和筛选在MVC中不起作用

时间:2015-03-26 04:49:55

标签: ajax asp.net-mvc asp.net-mvc-routing asp.net-mvc-5.1

在包含列表的每个索引视图页面上,我使用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排序和过滤器正在运行。

有没有人可以解释我,有什么问题?我是否使用了正确的方式(通过添加新路线)还是有其他方式吗?

1 个答案:

答案 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并抛出错误。