Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 登录表单isn';不在索引页上工作_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 登录表单isn';不在索引页上工作

Asp.net mvc 登录表单isn';不在索引页上工作,asp.net-mvc,Asp.net Mvc,我正在使用MVC。我从登录页面复制了登录表单,并将其插入一个新页面(主控制器、索引视图)。我将代码从accounts controller复制到index视图中。由于某种原因,我仍然无法登录。我不确定出了什么问题,因为看起来我完全复制了必要的代码。当我在索引页面上使用表单时,我没有得到任何验证错误,但它会将我返回到视图,并且我没有登录 您会注意到,我将这一行更改为重定向到错误页面,但我从未走到这一步: // If we got this far, something failed, redisp

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

您会注意到,我将这一行更改为重定向到错误页面,但我从未走到这一步:

// 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操作以登录相同的操作。晚上,在枪口下,你不会注意到简单的事情,直到一切都太晚了。你给了我宝贵的一课,谢谢!