使用jquery填充的值在服务器端验证mvc4上丢失

时间:2014-04-16 08:49:49

标签: jquery validation asp.net-mvc-4

查看

@Html.DropDownListFor(model => model.PracticGropupId, new SelectList(Model.PracticeGroup, "Value", "Text"))
@Html.DropDownListFor(model => model.SubPracticeGroupId, Enumerable.Empty<SelectListItem>(), new { style = "width:250px;" })

JS

$('#PracticGropupId').change(function () {

    var selectedGroupId = $(this).val();

    $.getJSON('/Business/SubPracticeGroup', { practiceGroup: selectedGroupId }, function (subGroups) {
        var subGroupsSelect = $('#SubPracticeGroupId');
        subGroupsSelect.empty();
        subGroupsSelect.append(
                $('<option/>')
                    .attr('value', '')
                    .text('Subgroup')
            );
        $.each(subGroups, function (index, subGroup) {
            subGroupsSelect.append(
                $('<option/>')
                    .attr('value', subGroup.Code)
                    .text(subGroup.Name)
            );
        });
    });
});

如果服务器端验证失败,则在提交时出现错误消息,并且SubPracticeGroupId下拉列表中的值变为空白。对于我使用jQuery ajax动态生成的HTML也会发生这种情况。有没有办法在服务器端验证后保留这些值?

2 个答案:

答案 0 :(得分:1)

使用 Ajax.BeginForm 而不是 Html.BeginForm ,因为 Html.BeginForm 会执行完整的回发,您将无法保留它们,使用 Ajax.BeginForm ,数据将异步发布。

答案 1 :(得分:0)

这就是我做的。我更改了以下Html.Begin表单

@using (Html.BeginForm("ActionName", "ControllerNmae", FormMethod.Post, new { enctype = "multipart/form-data" }))

@using (Ajax.BeginForm("ActionName", "ControllerNmae", new AjaxOptions
{
    InsertionMode = InsertionMode.InsertAfter, 
    HttpMethod = "POST",
    OnFailure = "ShowFailureMessage",
    OnSuccess="Success",
    UpdateTargetId ="error",
}))

为了显示验证消息,我创建了一个局部视图,并将其绑定到与我的父视图相同的ViewModel。 _error.cshtml

    @model Project.ViewModels.VieModelName

   <div class="error" >
       @Html.ValidationSummary(false)
    </div>

在父视图中添加了div以显示验证消息。该div的Id与ajax参数Parentview.cshtml中定义的相同

<div class="error" id="error" >
     @Html.ValidationSummary(false)
     @Html.Partial("_error")
 </div>

最后在控制器中:

  if (ModelState.IsValid)
  {
     .. Save logic
  }
  else
  {
     return PartialView("_error", VieModelName);
  }