我正在开发我的第一个MVC应用程序,而且我已经遇到了BeginForm的问题。当我在本地测试项目时,登录表单操作正在设置(正确)到
<form action="/Account/Login"
当我将它发布到实际网站时,它会莫名其妙地将应用程序名称添加到操作中,因此它看起来像这样
<form action="/appName/Account/Login"
因此,当您尝试实际登录时,路由表不知道发布请求的位置,并且在您按“提交”时没有任何反应。有没有办法可以覆盖这种行为?
Login.cshtml
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
............ form
}
RoutConfig.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
答案 0 :(得分:1)
您的代码没有任何问题。如果您将应用程序作为虚拟目录或应用程序托管在IIS中的网站下,那么ASP.NET MVC帮助程序(如Html.BeginForm)将此应用程序名称考虑在内是完全正常的。因此,您看到的/appname
前缀代表网站下IIS中的应用程序名称。您可以在一个网站下托管多个ASP.NET MVC应用程序,您可以看到ASP.NET MVC帮助程序正确地将它们考虑在内。
另一方面,如果您将应用程序直接作为WebSite托管在IIS中,而不创建任何子应用程序,则网址助手会将其考虑在内并生成action="/Account/Login"
。