1

我在 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>

我的便携式区域包含命名空间约束,而我的消费应用程序的路由没有。

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

4

2 回答 2

0

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

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

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

于 2012-02-27T17:46:39.607 回答
0

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

  1. 检索到最新的Mvc2 Futures 源代码
  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() 重载,并正确输出链接。

于 2012-02-27T22:02:10.483 回答