我使用 Url.Action 方法生成 Url 字符串。
这就是结果:
"/Home/GetRejectTest/0?IsSelected=False"
Run Code Online (Sandbox Code Playgroud)
控制器和操作名称是正确的,但查询参数搞砸了。这是因为该操作没有 RouteAttribute 因此生成了查询参数吗?
我的行动:
public ActionResult GetRejectTest(Test test)
{
return new EmptyResult();
}
Run Code Online (Sandbox Code Playgroud)
测试类具有 Id、Name、IsSelected 这 3 个属性。
我的路线定义:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
小智 5
您生成的 url ( /Home/GetRejectTest/0?IsSelected=False) 对于您的路由定义来说是正确的。您将一个新实例传递Test给该Url.Action()方法,其中
.ToString()根据模型中每个属性的
名称和值(使用 )在内部构建字典- 即controller=Home, action=GetRejectTest, id=0, Name=null, IsSelected=Falseurl: "{controller}/{action}/{id}") 并更新占位符(此时生成/Home/GetRejectTest/0),但您的路由定义没有 url 参数Name,
IsSelected因此将这些参数添加为查询字符串参数(因为
Name是null查询字符串)因为该属性未生成)所以现在的结果是/Home/GetRejectTest/0?IsSelected=False您尚未表明您实际期望的结果,但创建特定的路由定义将解决大多数情况。例如如果你想要
/Home/GetRejectTest/0/false
Run Code Online (Sandbox Code Playgroud)
或者/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 }
);
Run Code Online (Sandbox Code Playgroud)
请注意,因为Name是 typeofstring因此可以是null,{name}占位符需要是最后一个并标记为UrlParameter.Optional(否则它将恢复为使用查询字符串参数)