我正在使用MVC。我从登录页面复制了登录表单并插入到新页面(主页控制器,索引视图)。我将帐户控制器中的代码复制到索引视图中。由于某种原因,我仍然无法登录。我不确定是什么问题,因为我看起来完全复制了必要的代码。当我在索引页面上使用表单时,我没有得到任何验证错误,但它返回到视图,我没有登录。
您会注意到我更改了这一行以重定向到错误页面,但我从来没有这么做过:
// If we got this far, something failed, redisplay form
return RedirectToAction("Error", "Home");
我在这里发布了代码:http://pastebin.com/RUj6ASvE
答案 0 :(得分:1)
这是因为您要将from发布到Index操作,而您应该将其发布到您的身份验证逻辑所在的LogOn操作中。
尝试在视图中将Html.BeginForm()
更改为Html.BeginForm("LogOn", "HomeController")
。
In the code you posted您正在使用HomeController
的{{1}}动作展示该表单。并将其发回给同一个控制器的相同操作。但是这个动作并没有处理认证逻辑。这就是为什么没有发生任何事情并且你没有登录的原因。
但是,在默认的ASP.NET MVC 2网站中,他们会显示Index
的{{1}}操作中的表单:
AccountController
因此,当他们在视图中使用LogOn
时,它会创建一个表单,该表单将POST到同一个控制器的相同操作。因此,他们创建了名为public ActionResult LogOn() {
return View(); //returns the LogOn.aspx view
}
的另一个操作:
Html.BeginForm()
但这次他们用LogOn
属性装饰该动作。这意味着如果请求使用POST谓词点击[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl) {
//...
}
的{{1}}操作,则会执行上述方法。但是如果使用GET动词请求相同的动作(即没有POST主体),则将执行另一种方法。
基本上,您可以在HttpPost
:
AccountController
但是您的操作(应该处理身份验证逻辑的操作)的命名方式不同。这就是我们需要在LogOn
。