0

首先,我是 MVC 的新手,我是一个 webforms 人......

我想在我的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>
}

'

4

3 回答 3

2

你必须像这样修改你的表格:

@using (Html.BeginForm("Login","Account",FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))

关键是 "Login","Account" 部分,它告诉表单将​​数据发布到帐户控制器而不是主控制器的登录操作。我用同样的东西打了几个小时然后弄明白了。

如果数据没有发布到帐户控制器(实际验证用户名和密码并将用户登录的控制器),它将永远不会尝试登录。

原因是:默认情况下,在 routeconfig.cs 类中发送任何未指定操作的链接或表单,控制器将所有内容发送到 Home 控制器的 Index 操作。

希望这可以帮助

于 2013-09-16T07:04:28.130 回答
0

您应该使用子操作:

在您的控制器中:

[ChildActionOnly]
public ActionResult LoginForm()
{
    return View("_LoginFormPartialViewHere");
}

然后在您的主页视图中:

@{ Html.RenderAction("LoginForm"); }

在登录表单的部分视图中,您可以为登录视图模型强输入视图,但请确保为表单指定与默认“回发”模型不同的发布操作。此操作将处理登录并且仅处理登录(因此不是您的主页操作)。

于 2013-04-03T14:24:18.610 回答
0

您的问题是您试图编写代码而没有真正理解它的作用。在不了解它的作用的情况下,您只是随机改变事物,希望找到有用的东西。这是一种非常糟糕的软件编写方式。

您的问题根源在于您不了解 MVC 只是生成 HTML,并且不了解该 HTML 应该做什么,您几乎没有希望随机弄清楚这一点。

首先,MVC 没有“登录控件”的概念。它们只是 HTML 表单字段,它们位于 HTML 表单元素中。这些表单字段使用标准 HTML 发布到您的控制器,这意味着您必须确保表单操作方法正确,并且操作 url 正确。

其次,当这些表单字段被发布时,您必须有一个接收帖子的操作方法。如果该操作方法与 GET 中使用的操作方法不同,那么您将必须告诉 BeginForm() 助手要发布到哪里。

在 MVC 中,您不能像 Webforms 那样思考并假设一切都为您完成。您必须自己做所有事情,并确保每个链接、每个操作、每个选择器、每个 javascript 位等都是正确的。这比 WebForms 需要更多的工作,但它也更强大、更高效。

于 2013-09-16T07:34:31.163 回答