我的布局有登录部分视图(用户名,密码和提交按钮)和模型(一些控件和提交按钮),其中验证(服务器端和客户端)显示在普通视图中(布局中的@RenderBody())。 / p>
我的问题是,在我的任何视图中进行服务器端验证时,它还会验证登录部分视图,因为它执行登录的httppost功能。我该怎么办?
登录视图控制器
[HttpGet]
public ActionResult LogOn()
{
return PartialView();
}
//
// POST: /Account/LogOn
[HttpPut]
public ActionResult LogOn(LogOnModel model)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
ViewBag.UserName = model.UserName;
}
else
{
ModelState.AddModelError("", Resources.Account.Account.LoginFailureText);
}
}
return PartialView(model);
}
和模型控制器
public ActionResult MyModel()
{
ViewBag.DisplayThxMsg = false;
return View();
}
[HttpPost]
public ActionResult MyModel(Models.FeedbacksModel feedback)
{
if (ModelState.IsValid)
{
//do something
}
else{
//do another thing
}
return View(feedback);
}
答案 0 :(得分:1)
我觉得你的问题很难理解。我猜你的问题是你有一个登录部分控件显示为网站布局的一部分,并显示在所有页面上。因此,在提交任何页面时,用户名密码验证会启动,您希望阻止它。
了解所有验证@服务器端在模型绑定时发生,As属性绑定到已发布的字段,字段上的属性被查看和尊重/照顾。因此,为了防止服务器端验证,只需将登录部分视图放在它自己的表单中,这样就不会在页面上提交其他表单时发送。
总之有两种形式 - 一种用于登录,一种用于反馈。不要将所有输入字段放在相同的表单中。
如果此后仍然存在验证错误,那么原因还有其他原因,如输入转换问题。默认模型绑定器将为基本类型转换问题添加一些错误(例如,为“int”的内容传递非数字)。示例DataAnnotations模型绑定器将填充模型状态,并从DataAnnotations属性获取验证错误你的模特。
修改的
如果你看第125行
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");}
您有以上代码将呈现登录表单。 它将在第45行的另一种形式内完成。
<form id="form1" runat="server" method="post">
这没有结束标记因此它将包含整个文档,直到</html>
您应该从
更改结构<form id="form1" runat="server" method="post">
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");}
</form
到
<form id="form1" runat="server" method="post">
</form>
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");}
此行@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");}
将呈现此表单<form id="LoginView1" action="LogOn">
及其所有子元素。
最新编辑
在您的布局页面中使用此:
@Html.Partial("~/Views/Shared/LogOnPartial.cshtml", new LogOnModel())
而不是这个:
@Html.Action("LogOnPartial", "Account")
这一切有效的原因是,LogOnPartial
标记为[HttpPost]
的方法被调用,因为请求是在POST上下文中。你想要的是,你只需要在没有动作的情况下执行视图,即使在POST时也是如此。上面的代码就是这么做的。它在不调用action方法的情况下呈现视图。 MVC3是一种愚蠢的servent:它只知道当请求在post上下文中时它应该调用标有[HttpPost]
的Action方法。它不知道请求是在另一个动作(索引)的后置上下文中而不是这个(logonpartial)。所以现在你可以删除这个方法
public ActionResult LogOnPartial()
{
return PartialView();
}
将不再使用。
请注意,您需要更改帐户控制器的LogOnPartial方法才能返回
成功登录后,return RedirectToAction("Index","Home");
代替return PartialView(model);
。在失败时,您无法在编码时渲染部分视图。您必须返回一个全新的视图。它既不能是索引也不能是LogonPartails - 只需返回具有自己布局的return View("Login_Error_View");
。否则将很难控制工作流程。