【问题标题】:Html.BeginForm rendering with "/" actionHtml.BeginForm 用“/”动作渲染
【发布时间】:2014-01-16 10:15:07
【问题描述】:

我定义了以下路线

    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);
        }
    }

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这是我所期望的,因为我正在处理 MVC 和 Webforms 的混合体,如果有任何请求试图访问应用程序根目录,我发现一些遗留代码会重定向到旧的登录 Web 表单。非常感谢
    【解决方案2】:

    实际上这是预期的行为。实际上路由系统非常聪明,它知道即将到来的请求是针对默认值的。(在您的情况下,默认控制器是帐户,默认操作是登录,在您的开始表单中,您使用的是相同的控制器和操作)。 所以路由系统将取代它 经过 '/'。

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

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

    现在您将拥有类似的链接

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

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

    谢谢

    【讨论】:

    • 它在从帐户控制器的登录视图呈现的部分视图上
    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多