为什么验证会在局部视图中中断?

时间:2012-04-09 21:50:25

标签: c# asp.net-mvc-3 validation partial-views

此验证应该有效,但如果下拉列表中没有选定值,则帖子会在其后面触发。当移动到另一个非局部时,验证工作正常。编辑简洁。

视图模型:

public class BuilderVM
{
    [Display(Name = "Select A Task")]
    [Required]
    public int? TaskId { get; set; }
    public GenericSelectList Tasks { get; set; }
}

父视图(部分视图在帖子后显示在此页面的底部。您可能已经注意到,ajax选项规定部分视图将以div id="MoveOn"呈现):

@{
 ViewBag.Title = "Builder";
 AjaxOptions ajaxOpts = new AjaxOptions
 {
    LoadingElementDuration = 2,
    LoadingElementId = "removeChoice",
    UpdateTargetId = "MoveOn"
 };
}
<div id="removeChoice">
@using (Ajax.BeginForm("Selected", ajaxOpts))
{
<fieldset>
    <div>
     //Data For Submission (This data validates perfectly before post)
    </div>
    <p><input type="submit" value="Go" /></p>
</fieldset>
}
</div>
<div id="MoveOn"></div>

部分视图(在父视图的帖子后呈现):

@model namespace.BuilderVM
@{
 AjaxOptions ajaxOpts = new AjaxOptions
  {
    UpdateTargetId = "Entry",
    LoadingElementDuration = 2,
    LoadingElementId = "RemoveEntry"
  };
}

<div id="RemoveEntry">
<h2>Details</h2>
@using (Ajax.BeginForm("Data", ajaxOpts))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Data</legend>
<div>
    <span class="label">@Html.LabelFor(model => model.TaskId)</span>
    <span class="content">
    @Html.DropDownListFor(
        model => model.TaskId,
        new SelectList(
            Model.Tasks.Values,
            "Id",
            "DisplayFields",
            Model.Tasks.StartValue
        ),
        Model.Tasks.Message
    )
    </span>@Html.ValidationMessageFor(model => model.TaskId)
</div>
<p><input type="submit" value="Add Work Completed Data" /></p>
</fieldset>
}
</div>
<div id="Entry"></div>

虽然dropdownlistfor绑定到model.TaskId,当单击post按钮([Required])并且在下拉列表中没有选择任何值时,会使用input type="submit"注释该帖子而不是停止并附加验证消息。我不知道该怎么做才能解决这个问题,因为当复制粘贴到常规视图时它可以正常工作。为什么部分视图验证不起作用?

1 个答案:

答案 0 :(得分:3)

问题是验证器只是在开头加载(使用$(document).ready())。 你可以做的是以下(在局部视图中插入):

    <script>
        $(function() {
            $.validator.unobtrusive.parse('.Content');
        });
    </script>

根据给定的信息,我认为这是你的问题。希望这会对你有所帮助。