【问题标题】:Why is my validation firing on the get request before the post in MVC3?为什么我的验证在 MVC3 中发布之前的 get 请求上触发?
【发布时间】:2012-04-14 07:53:58
【问题描述】:

我有一个 MVC3 视图,使用户能够创建几个不同的东西。在父视图中,执行此操作的表单通过 jquery ui 选项卡进行分解,如下所示:

<div id="tabs">
        <ul>
            <li><a href="#tabs-1">New Thing 1</a></li>
            <li><a href="#tabs-2">Different New Thing</a></li>
        </ul>
    <div id="tabs-1">@Html.Action("CreateNewThing", "NewThingController")</div>
    <div id="tabs-2">@Html.Action("CreateDifferentThing", "DifferentThing")</div>
    <div></div>
</div>

<script type="text/javascript">
    $(function () {
        $("#tabs").tabs();
    });
</script> 

在局部视图中我有:

@model NewThingViewModel

    @using (Html.BeginForm("CreateNewThing", "NewThingController", FormMethod.Post, new { id = "frmCreateNewThing" }))
    { 
    ...

带有输入字段、提交按钮等。这似乎运作良好:它呈现所有内容并发布到正确的控制器操作方法。

但是我现在正在验证中,但遇到了问题。

在控制器中,它像这样渲染视图:

public ActionResult CreateNewThing(NewThingViewModel model)
{

 ... initializing model fields, drop downs etc.

    return PartialView("CreateNewThing", model);
}

我有一个单独的 post 方法,如下所示:

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult CreateNewThing(NewThingViewModel newThingViewModel, FormCollection collection)
 {
         .....
 }

示例模型:

    public class NewThingViewModel
    {
        [Required]
        [StringLength(50)]
        [Display(Name = "Display Name:")]
        public string DisplayName { get; set; }     
     }

问题是,当页面第一次出现时,模型中通过 DataAnnotations 标记为 [Required] 的字段显示为红色,并且在页面最初显示时验证摘要显示它们无效。 IE。它的行为就像在用户在初始加载时输入任何内容甚至在文本框中输入任何内容之前就已经发布了一样。

我知道第一个非发布 CreateNewThing 正在触发,因为我可以在调试器中捕获它,并且我知道第二个在初始加载时没有。

什么会导致我的验证在 Get 上触发?

是因为 Html.Action 的工作方式以及我将部分视图渲染到另一个视图的事实吗?

我在 web.config 中使用 UnobtrusiveJavaScriptEnabled 和 ClientValidationEnabled = true。

我找不到遇到此特定问题的其他人。其他所有示例似乎都有效,然后我再次找不到将视图分为三个部分的示例,其中包含在 jquery ui 选项卡中。

我该如何解决这个问题?
选项: 我是否需要手动操作 Model.IsValid 作为解决方法? 使用不同的机制在父视图而不是 Html.Action 上呈现部分视图? 使用一些 javascript/jquery 来捕获验证并停止它?

【问题讨论】:

  • 我要看的是错误是来自服务器还是客户端验证启动。

标签: asp.net asp.net-mvc-3 validation jquery-ui-tabs asp.net-mvc-partialview


【解决方案1】:

在您的 GET 控制器操作中没有方法参数。您可以初始化一个空模型并将其传递给视图,但您不需要将模型传递给方法

【讨论】:

  • 成功了!我将模型从参数中取出并在方法中对其进行了初始化。谢谢!
【解决方案2】:

当你应该传入null时,你传入的是一个“空”模型(我假设它为你的所需属性设置了默认值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多