使用“/”动作渲染Html.BeginForm

时间:2014-01-16 10:15:07

标签: c# asp.net asp.net-mvc-2 asp.net-mvc-routing

我定义了以下路线

    routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Account", action = "Login", id = UrlParameter.Optional }
        );

然后我尝试使用Html.BeginForm,如下所示

     <% using (Html.BeginForm("Login", "Account", System.Web.Mvc.FormMethod.Post, new { @class = "login-form" }))
       { %>

但这会给我一个类似下面的表格

    <form class="login-form" action="/" method="post">
    </form>

但是,如果我将我的路线上的默认值更改为不同的

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Login", id = UrlParameter.Optional }
        );

我的表单然后正确呈现,对于我在我的帐户控制器上从登录方法返回的部分视图中使用Html.BeginForm()的信息。

    public class AccountController : Controller
    {

       public ActionResult Login()
       {
           return View();
       }

       [HttpPost]
       public ActionResult Login(LoginModel model)
       {
           if (ModelState.IsValid)
           {
              //TODO: Login user
            }
            return View(model);
        }
    }

2 个答案:

答案 0 :(得分:0)

实际上这是预期的行为。实际上路由系统非常聪明,它知道即将发出的默认值请求。(在您的情况下,默认控制器是Account,默认操作是Login,在您的开始表单中,您使用相同的控制器和操作)。 因此路由系统将取代它     用'/'。

您可以通过添加另一个控制器来设置管理员和相同的查看登录来验证它。现在只需用新的控制器替换控制器,如

<% using (Html.BeginForm("Login", "Admin", System.Web.Mvc.FormMethod.Post,
   new { @class =  "login-form" }))

现在您将拥有类似

的链接
<form class="login-form" action="/Admin" method="post"></form>

不会有任何操作,因为路由系统会发现操作是默认操作。

由于

答案 1 :(得分:0)

您需要注意的行为是正确的,也是正确的。生成链接时,MVC会遍历路径集合中的路径列表(自上而下),并根据您在Html.BeginForm中提供的路径数据查看哪些路径可以匹配。例如,您可以想象一个请求来自POST /,在这种情况下,由于存在默认值,您的帐户控制器的登录操作将被调用。