在ASP.NET MVC中的Form.Begin中使用命名路由

时间:2009-01-23 22:50:41

标签: asp.net-mvc routing

使用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。

我应该将这个缺失的超载报告为一个问题吗?

1 个答案:

答案 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的扩展方法。