使用Form.Begin时,有没有办法强制在ASP.NET MVC中使用命名路由。我正在学习越来越多关于路由的知识,如果你只是改变顺序或者参数是否有默认值,它会变得非常脆弱。
<% Form.Begin(...) %> <!-- no overload for providing a route name --%>
对于开始表单的命名路由似乎没有超载,所以相反我能想出的最好的是:
<form action="/Products/Command/ViewProduct" method="post">
我想知道这个缺失的重载是否是一个疏忽(现在是Beta),如果有理由或者另一种方法来生成URL。
我尝试使用RouteLink并将其嵌入到Form标记中,但RouteLink为我创建了<A>
标记的完整HTML,这是不合适的。
action="<%= Ajax.RouteLink("Update Status", "product-route-short", new { action = "GetStatus", sku = "" }, new AjaxOptions { UpdateTargetId = "status" })%>"
我有什么替代方法可以从命名路由生成URL。
我应该将这个缺失的超载报告为一个问题吗?
答案 0 :(得分:2)
如果需要生成指向路径的URL,可以使用Url.RouteUrl()
,只需将控制器和操作放入路由值对象中,如下所示:
<%= Url.RouteUrl("NamedRoute", new { controller="Controller", action="Action", foo="Bar" ... }) %>
至于添加重载,很多这些帮助程序有很多不同的重载,它们开始冲突并变得模棱两可。例如,请考虑以下重载
public string BeginForm(string actionName, string controllerName)
public string BeginForm(string actionName)
public string BeginForm(string routeName, string actionName) // Uh oh!
第1和第3个签名相同,因此无效。
如果您需要经常使用命名路由,您可以随时创建自己的表单助手作为HtmlHelper的扩展方法。