主视图中的服务器端验证导致部分视图中的验证,如何停止?

时间:2011-08-09 08:38:04

标签: asp.net-mvc-3 validation razor

我的布局有登录部分视图(用户名,密码和提交按钮)和模型(一些控件和提交按钮),其中验证(服务器端和客户端)显示在普通视图中(布局中的@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);
    }

1 个答案:

答案 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");。否则将很难控制工作流程。