我有一个 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 来捕获验证并停止它?