首先,我是MVC新手,我是一个网络形象的人......
我想在我的home/index
页面上显示我的登录控件,但无论我做什么,我都会遇到错误。我尝试了各种技术并且每种技术都有很多错误,所以我不会在这里列出它们。
现在我设置如果Request.IsAuthenticated
然后显示用户名,则显示登录表单。但是表单显然是在查看主控制器,当我提交登录时没有任何反应。
非常感谢任何建议。我在这方面已经涉足了好几天。
谢谢:)
以下是代码:
'@{
ViewBag.Title = "MyApp";
}
<p>Code for main Index Page here</p>
@model Application.Models.LoginModel
@{
ViewBag.Title = "Log in";
}
@if (Request.IsAuthenticated) {
<text>
Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", routeValues: null, htmlAttributes: new { @class = "username", title = "Manage" })!
@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
@Html.AntiForgeryToken()
<a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}
</text>
} else {
<section id="loginForm">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = "RedirectToAction" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
</li>
</ol>
<input type="submit" value="Log in" />
</fieldset>
<p>
@Html.ActionLink("Register", "Register", "Account") if you don't have an account.
</p>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
</section>
}
答案 0 :(得分:2)
你必须像这样修改你的表格:
@using (Html.BeginForm("Login","Account",FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
密钥是“登录”,“帐户”部分,它告诉表单将数据发布到帐户控制器的登录操作而不是家庭控制器。我用相同的东西战斗了几个小时然后想出来了。
如果数据没有发布到帐户控制器(实际验证用户名和密码的控制器并将用户登录),它将永远不会尝试登录。
原因是: 默认情况下,routeconfig.cs类发送任何未指定操作的链接或表单,控制器将所有内容发送到Home控制器的Index操作。
希望这有帮助
答案 1 :(得分:0)
您应该使用儿童行动:
在您的控制器中:
[ChildActionOnly]
public ActionResult LoginForm()
{
return View("_LoginFormPartialViewHere");
}
然后在您的主页视图中:
@{ Html.RenderAction("LoginForm"); }
在登录表单的部分视图中,您可以强烈键入登录视图模型的视图,但请确保为表单指定与默认“回发”模型不同的后期操作。此操作将处理登录和仅登录(因此不是您的主页操作)。
答案 2 :(得分:0)
你的问题在于你试图编写代码而不是真正理解它的作用。如果不了解它的作用,你只需随意改变一些东西,希望找到有用的东西。这是编写软件的一种非常糟糕的方式。
你的问题根源在于你不明白MVC只是在生成HTML,而且在不了解HTML本应该做什么的情况下,你几乎没有希望随机搞清楚这一点。
首先,MVC没有“登录控制”的概念。它们只是HTML表单字段,它们位于HTML表单元素中。这些表单字段使用标准HTML发布到您的控制器,这意味着您必须确保您的表单操作方法是正确的,并且操作URL是正确的。
其次,当发布这些表单字段时,您必须有一个将接收帖子的操作方法。如果该动作方法与GET中使用的动作方法不同,那么您必须告诉BeginForm()帮助器在哪里发布。
在MVC中,你不能像Webforms那样思考,只是假设一切都为你完成。你必须自己做所有事情,并确保每个链接,每个动作,每个选择器,每一点javascript等都是正确的。这比WebForms更多,但它也更强大,更有效。