我正在尝试在ASP.NET MVC 4应用程序中设置登录表单。目前,我已经配置了我的视图,如下所示:
RouteConfig.cs
routes.MapRoute(
"DesktopLogin",
"{controller}/account/login",
new { controller = "My", action = "Login" }
);
MyController.cs
public ActionResult Login()
{
return View("~/Views/Account/Login.cshtml");
}
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
return View("~/Views/Account/Login.cshtml");
}
当我尝试在浏览器中访问/ account / login时,收到错误消息:
The current request for action 'Login' on controller type 'MyController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Login() on type MyApp.Web.Controllers.MyController
System.Web.Mvc.ActionResult Login(MyApp.Web.Models.LoginModel) on type MyApp.Web.Controllers.MyController
如何在ASP.NET MVC 4中设置基本表单?我已经看过ASP.NET MVC 4中的示例Internet App模板。但是,我似乎无法弄清楚路由是如何连接的。非常感谢你的帮助。
答案 0 :(得分:7)
我还没有尝试过这个但是你可以尝试使用适当的Http动词来注释你的登录操作吗 - 我假设您正在使用GET
查看登录页面和POST
用于处理登录。
通过为第一个操作添加[HttpGet]
而为第二个操作添加[HttpPost]
,理论上ASP.Net的路由将根据哪个方法知道调用哪个Action方法用过的。您的代码应该如下所示:
[HttpGet] // for viewing the login page
[ViewSettings(Minify = true)]
public ActionResult Login()
{
return View("~/Views/Account/Login.cshtml");
}
[HttpPost] // For processing the login
[ViewSettings(Minify = true)]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
return View("~/Views/Account/Login.cshtml");
}
如果这不起作用,请考虑使用两条路线和两条不同命名的动作,如下所示:
routes.MapRoute(
"DesktopLogin",
"{controller}/account/login",
new { controller = "My", action = "Login" }
);
routes.MapRoute(
"DesktopLogin",
"{controller}/account/login/do",
new { controller = "My", action = "ProcessLogin" }
);
StackOverflow上还有其他类似的问题和答案,请查看:How to route GET and DELETE for the same url,还有ASP.Net documentation也可能会有所帮助。