2013-04-03 93 views
0

首先,我是新来的MVC上放置MVC 4登录控制,我是一个web表单的家伙......首页/索引页

我想表明我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> 
} 

'

+1

你能发布一些你的代码吗? HTML/CSS等...? –

+0

只需添加代码即可发布。现在控制器只是返回一个视图()没有什么特别的,直到我可以弄清楚。 –

+0

您是否尝试在您的家庭控制器中使用@ Html.partial(“linktologinview”)'? –

回答

0

您应该使用儿童行动:

在你的控制器:

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

然后在y我们的主页视图:

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

在你的登录表单的局部视图,您可以强键入查看您登录浏览模式,但一定要指定您的形式大于默认的“回传不同的职位动作“模型。此操作将处理登录并仅处理登录(所以不会处理您的主页操作)。

+0

我得到“执行处理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'的子请求时出错。”错误 –

+0

更改控制器为: '[ChildActionOnly] public ActionResult LoginForm() { // return View(“_ LoginFormPartialViewHere”); return View(“_ LoginPartial”); }' 现在控制器根本不显示,但没有错误:) –

+0

您是否在您的主页视图中调用了RenderAction? –

2

必须修改您的形式是这样的:

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

关键是“登录”,“帐户”部分,它告诉表单把数据上传到帐户控制器的登录操作,而不是的家庭控制器。我用同样的东西打了几个小时然后算出来了。

如果数据不会发布到帐户控制(实际验证用户名和密码,并记录用户在控制器),它永远不会尝试登录他们

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

希望这有助于在这里

0

你的问题是,你正试图实际上不理解它做什么编写代码。如果不理解它的作用,你只是随意改变希望找到有效的东西。这是编写软件的一种非常糟糕的方式。

你的问题根源在于你不明白MVC仅仅是生成HTML,并且不理解HTML应该做什么,你几乎没有希望随机地找出它。

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

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

在MVC中,你不能像Webforms那样思考,只是假设一切都已经完成了。你必须自己做所有事情,并确保每一个链接,每一个动作,每一个选择器,每一个JavaScript等等都是正确的。这比WebForms更有用,但它也更强大,更高效。