Url.Action会生成错误的网址

时间:2016-01-20 20:48:12

标签: c# asp.net-mvc

我使用Url.Action方法生成Url字符串。

enter image description here

结果如下:

"/Home/GetRejectTest/0?IsSelected=False"

控制器和操作名称正确但查询参数搞砸了。这是因为该操作没有RouteAttribute因此会生成查询参数吗?

我的行动:

   public ActionResult GetRejectTest(Test test)
        {
            return new EmptyResult();

        }

测试类有3个属性Id,Name,IsSelected。

我的路线定义:

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

1 个答案:

答案 0 :(得分:3)

您的生成(/Home/GetRejectTest/0?IsSelected=False)的网址对于您的路线定义是正确的。您将Test的新实例传递给Url.Action()方法,

  1. 根据名称和值在内部构建字典 (使用.ToString())模型中的每个属性 - 即 controller=Home, action=GetRejectTest, id=0, Name=null, IsSelected=False
  2. 然后在路线定义中搜索找到的匹配项 (url: "{controller}/{action}/{id}")并更新占位符 (此时生成/Home/GetRejectTest/0)但是你的 路由定义没有Name和的{url}参数 IsSelected所以这些被添加为查询字符串参数(因为 Namenull,未生成该属性的查询字符串) 所以结果现在是/Home/GetRejectTest/0?IsSelected=False
  3. 您尚未指出实际期望的结果,但创建特定路线定义将解决大多数情况。例如,如果你想要

    /Home/GetRejectTest/0/false
    

    /Home/GetRejectTest/0/false/someName如果Name的值不是null,则可以创建其他路由(必须在默认路由之前)

    routes.MapRoute(
      name: "Test",
      url: "Home/GetRejectTest/{id}/{isselected}/{name}",
      defaults: new { controller = "Home", action = "GetRejectTest", name = UrlParameter.Optional }
    );
    

    请注意,因为Name的类型为string,因此可能是null{name}占位符需要是最后一个并标记为UrlParameter.Optional(否则它将恢复使用查询字符串参数)