Asp.net mvc 登录表单isn';不在索引页上工作
我正在使用MVC。我从登录页面复制了登录表单,并将其插入一个新页面(主控制器、索引视图)。我将代码从accounts controller复制到index视图中。由于某种原因,我仍然无法登录。我不确定出了什么问题,因为看起来我完全复制了必要的代码。当我在索引页面上使用表单时,我没有得到任何验证错误,但它会将我返回到视图,并且我没有登录 您会注意到,我将这一行更改为重定向到错误页面,但我从未走到这一步:Asp.net mvc 登录表单isn';不在索引页上工作,asp.net-mvc,Asp.net Mvc,我正在使用MVC。我从登录页面复制了登录表单,并将其插入一个新页面(主控制器、索引视图)。我将代码从accounts controller复制到index视图中。由于某种原因,我仍然无法登录。我不确定出了什么问题,因为看起来我完全复制了必要的代码。当我在索引页面上使用表单时,我没有得到任何验证错误,但它会将我返回到视图,并且我没有登录 您会注意到,我将这一行更改为重定向到错误页面,但我从未走到这一步: // If we got this far, something failed, redisp
// If we got this far, something failed, redisplay form
return RedirectToAction("Error", "Home");
我在这里发布了代码:这是因为您正在将from发布到Index操作,而您应该将其发布到登录操作,您的身份验证逻辑在其中 尝试将视图中的
Html.BeginForm()
更改为Html.BeginForm(“登录”、“家庭控制器”)
您是从HomeController
的索引
操作中显示表单的。并将其发回同一控制器的相同操作。但该操作并没有处理身份验证逻辑。这就是为什么什么都没有发生,你也没有登录
但是,在默认的ASP.NET MVC 2站点中,他们从AccountController
的登录操作中显示表单:
public ActionResult LogOn() {
return View(); //returns the LogOn.aspx view
}
因此,当他们在视图中使用Html.BeginForm()
时,它将创建一个表单,该表单将发布到同一控制器的相同操作。因此,他们创建了另一个名为LogOn
的操作:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl) {
//...
}
但是这次他们用HttpPost
属性来修饰这个动作。这意味着,如果请求使用POST动词点击AccountController
的LogOn
操作,则将执行上述方法。但是,如果使用GET谓词请求相同的操作(即没有POST主体),则将执行另一个方法
因此,基本上,您可以在您的家庭控制器中执行此操作:
public ActionResult Index() {
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View(); //returns the view which has the form
}
[HttpPost]
public ActionResult Index(LogOnModel model, string returnUrl) {
//handles the post
}
但是您的操作(应该处理身份验证逻辑的操作)的名称不同。这就是为什么我们需要在Html.BeginForm(“LogOn”,“HomeController”)
中显式设置控制器和操作名称的原因,就是这样!你能告诉我为什么在登录表单视图中不一定要这样吗?下面是我从标准asp.net mvc登录控制器和视图中复制的代码:@Jason Shultz,当您使用Html.BeginForm()
定义表单时,它会将表单的操作属性设置为当前路由。因此,登录视图不需要显式设置控制器和操作,因为它需要使用post方法将表单发布到同一控制器和同一操作。我希望这是有道理的。我理解你的意思,我只是很难理解/home/index和/accounts/logon之间的区别。在我未经训练的眼里,我看不出有什么不同。@Jason Shultz,我编辑了答案,详细解释了原因。我希望有帮助。谢谢!那太好了。当我从accounts controller复制我的post操作时,我没有注意到我已重命名(保留?)我的post操作以登录相同的操作。晚上,在枪口下,你不会注意到简单的事情,直到一切都太晚了。你给了我宝贵的一课,谢谢!