【问题标题】:Url.Action generates a wrong urlUrl.Action 生成错误的 url
【发布时间】:2016-04-26 21:34:44
【问题描述】:

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

结果如下:

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

控制器和动作名称正确,但查询参数搞砸了。是不是因为action没有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 }
            );

【问题讨论】:

  • urlHelper 是什么?
  • 显示动作方法签名和相关注册路由
  • 它的 System.Web.Mvc.UrlHelper
  • 什么是价值观?从您的屏幕截图中,看起来字典的 Name 和 Id 有 0 和 null 值。所以无论你得到什么都是预期的结果。不是吗?
  • 假设valuesTest 的新默认实例,(并且您使用默认路由{controller}/{action}/{id}),那么url 正确

标签: c# asp.net-mvc


【解决方案1】:

您生成的 url (/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

您尚未说明您实际期望的结果,但创建特定的路线定义将解决大多数情况。例如,如果你想要

/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 }
);

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

【讨论】:

  • 好的,现在我明白了。我在自己身上使用 id 作为查询参数真是太愚蠢了 ;-) 感谢您的合理解释。
猜你喜欢
  • 2010-12-17
  • 2017-10-07
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2014-05-09
  • 1970-01-01
相关资源
最近更新 更多