最近、プロジェクトを MVC 4 にアップグレードしました。アカウント/インデックスにログイン ページがあります。Html.BeginForm を使用すると、コントローラーのポスト アクションに到達していませんでした。
さらにいじった後、ヘルパーによって生成された HTML が次のようなものであることがわかりました。
<form action="/Account" autocomplete="off" method="post" requireSSL="true">
Html.BeginForm を次のように html に置き換えると:
<form action="/Account/Index" autocomplete="off" method="post" requireSSL="true">
ポスト アクションに正しく到達します。
私はなぜ理解できないのですか?これは、以前は MVC 3 で常に機能していました。登録されたルートは、標準の Microsoft テンプレートです。
public class RouteConfig
{
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 }
);
}
}
編集:
コントローラーコード:
public ActionResult Index()
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("RedirectUser");
}
return View();
}
[HttpPost]
public ActionResult Index(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl != "/")
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("RedirectUser", "Account");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}