登录表单在索引页面上不起作用

时间:2010-02-28 03:07:48

标签: asp.net-mvc

我正在使用MVC。我从登录页面复制了登录表单并插入到新页面(主页控制器,索引视图)。我将帐户控制器中的代码复制到索引视图中。由于某种原因,我仍然无法登录。我不确定是什么问题,因为我看起来完全复制了必要的代码。当我在索引页面上使用表单时,我没有得到任何验证错误,但它返回到视图,我没有登录。

您会注意到我更改了这一行以重定向到错误页面,但我从来没有这么做过:

// If we got this far, something failed, redisplay form
            return RedirectToAction("Error", "Home");

我在这里发布了代码:http://pastebin.com/RUj6ASvE

1 个答案:

答案 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

中明确设置控制器和操作名称的原因