在Home / index页面上放置MVC 4登录控件

时间:2013-04-03 14:13:21

标签: asp.net-mvc asp.net-mvc-4

首先,我是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>
}

3 个答案:

答案 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更多,但它也更强大,更有效。