为什么Html.BeginForm会生成空操作?

时间:2011-06-16 00:07:15

标签: asp.net-mvc-3 html.beginform

我在一个名为Admin

的区域内有一个控制器
public class SiteVisitController : Controller
{
    public ViewResult ReadyForCompletion() { ... }

    public ViewResult CompleteAndExport() { ... }
}

和一个视图(ReadyForCompletion.cshtml),它回发到同一个类上的不同控制器操作

@using (Html.BeginForm( "CompleteAndExport", "SiteVisit" ))
{        
    <input type="submit" value="Complete &amp; Export" />
}

此表单生成的HTML有一个空白操作:

<form action="" method="post">  <input type="submit" value="Complete &amp; Export" />

</form>

我想知道为什么会有空白动作?有关详细信息,我还添加了

@Url.RouteUrl(new { controller = "ReadyForCompletion", action = "SiteVisit", area = "Admin" })

也打印出一个空字符串。另外,如果我使用空Html.BeginForm(),它会生成正确的操作。

注册路线

        context.MapRoute(
            "Admin_manyParams",
            "Admin/{controller}/{action}/{id}/{actionId}",
            new { action = "Index", id = UrlParameter.Optional, actionId = UrlParameter.Optional }
        );

2 个答案:

答案 0 :(得分:10)

我相信您的问题是由连续的可选参数引起的。在更改路径以包含两个可选参数之前,我无法复制您的问题。

请参阅:This article which explains the problem

答案 1 :(得分:0)

对于那些使用ASP.NET Core遇到此问题的人来说,根本原因是相同的,尽管解决方案略有不同。我第一次在Core中看到这个,在调用.MapRoutes()时使用了多个默认值。 E.g。

routes.MapRoute(
    name: "default",
    template: "{controller}/{action}/{id?}",
    defaults: new { controller = "Foo", action = "Bar" }
);

解决方法是将默认值放入字符串模板中:

routes.MapRoute(
    name: "default",
    template: "{controller=Foo}/{action=Bar}/{id?}"
);

因人而异。