MvcContrib强类型的BeginForm重载路由到便携区域而不是消耗路由

时间:2012-02-27 17:39:25

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing mvccontrib portable-areas

我在MVC2网站上使用MvcContrib 2.0.95.0。我们创建了可移植区域并在页面上使用它们。

在我的浏览页面上,我的便携式区域使用了一个小部件,我注意到BeginForm正在将我的帖子发送到我的便携式区域。

using (Html.BeginForm<MyController>(f => f.SomeResult(null), FormMethod.Post){
}

这产生以下路线。请注意路线中的自定义区域:

<form action="/Custom/My/SomeResult" class="observeform" id="SomeForm" method="post">
....

</form>

为了比较起见,我把字符串重载在它上面的BeginForm:

using(this.Html.BeginForm("SomeResult", "My"))
{

我的便携式区域在控制器上没有这个,所以我很困惑为什么它会在这里路由。

...它产生了以下正确的路线:

<form action="/My/SomeResult" method="post">
....
</form>

我的便携式区域包含命名空间约束,而我的消费应用程序的路由确实存在 不

在我的链接和表单创建中不使用字符串重载,如何防止我的便携式区域污染我的消费应用程序的路由?

2 个答案:

答案 0 :(得分:0)

尝试使用[ActionLinkArea]属性修饰控制器并指定一个空字符串以指示此控制器属于根网站而不是任何区域:

[Microsoft.Web.Mvc.ActionLinkArea("")]
public class MyController : Controller
{
    ...
}

现在Html.BeginForm<MyController>助手将生成预期结果。

答案 1 :(得分:0)

要解决,我采取了以下步骤。

  1. 检索到最新的Mvc2 Futures source code
  2. 修改System.Web.Mvc引用以使用GAC库 - 项目引用。
  3. 编辑以下文件:Microsoft.Web.Mvc.LinkBuilder,第21行:

    // changed this
    VirtualPathData vpd = routeCollection.GetVirtualPath(context, routeValues);
    
    // to this
    VirtualPathData vpd = routeCollection.GetVirtualPathForArea(context, routeValues);
    
  4. 在我重新编译并将dll部署到我的项目之后,我将表单代码重构为强类型的BuildForm()重载并正确输出链接。