2013-05-07 69 views
1

我试图利用MVC中的内置验证,它似乎没有工作。如果我将表单中的字段留空,我会返回“成功保存”。信息。MVC验证在弹出窗口中无法正常工作

不应该在表单中标记为必填字段?

Form Image

控制器:

public ActionResult Create([DataSourceRequest] DataSourceRequest request, ACore.Asset assetForm) 
    { 
     var results = new 
     { 
      value = false, 
      Message = "" 
     }; 

     if (ModelState.IsValid) 
     { 
      results = new 
      { 
       value = true, 
       Message = "Successfully Saved." 
      }; 

      return Json(results); 
     } 

     results = new 
     { 
      value = false, 
      Message = "Please check the form values." 
     }; 

     return Json(results); 
    } 

视图(冷凝):

@using (Html.BeginForm("Create", "Asset", FormMethod.Post, new { id = "frmAsset"})) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <div class="tempStyle"> 
     <div class="editor-label fl"> 
      @Html.LabelFor(model => model.AssetName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.AssetName) 
      @Html.ValidationMessageFor(model => model.AssetName) 
     </div> 
    </div> 
    <div style="position: relative;"> 
     <input type="button" value="Save" id="btnSave" /> 
    </div> 

的JavaScript处理我保存:

var saveAsset = function (e) { 
     var form = $("#frmAsset"); 
     $.ajax({ 
      type: "POST", 
      url: "/Asset/Create", 
      data: $(form).serialize(), 
      success: function (data) { 
       if (data.value == true) { 
        alert(data.Message); 

        // Close popup window 
        var window = $('#AssetEditorPopUp').data("kendoWindow"); 
        window.close(); 

        // Refresh grid to show changes 
        $('#grid').data("kendoGrid").dataSource.read(); 

        return; 
       } 

       alert(data.Message); 

      }, 

      error: function() { 
       alert("There was an error editing the asset."); 
      } 
     }); 
    }; 

型号:

public class Asset 
{ 
    [ScaffoldColumn(false)] 
    public int AssetId { get; set; } 

    [Required] 
    [Display(Name="Asset Name:")] 
    public string AssetName { get; set; } 

    public string AssetFormerName { get; set; } 
    public string Seg1Code { get; set; } 
    public string Seg3Code { get; set; } 
    public bool? ActiveFlag { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string AssetType { get; set; } 

    [Display(Name = "ZipCode:")] 
    [RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")] 
    public string ZipCode { get; set; } 
} 

这就是我做POST而不是ajax。

enter image description here

+0

有趣的问题。为了您的利益,您是否也启用了客户端验证?检查web.config中的ClientValidationEnabled – 2013-05-07 16:04:09

+0

如果您执行普通POST而不是使用Ajax,那么验证工作也会进行吗? – 2013-05-07 16:05:17

+0

我的web.config中启用了客户端验证。我会尝试一个正常的POST,我会回到这里。 – Mithrilhall 2013-05-07 17:05:54

回答

1

您的按钮被设置为类型的按钮,应提交。你没有激发表单提交处理程序,所以验证没有执行。

创建您的形式是这样的:

@using (Html.BeginForm("Create", "Asset", FormMethod.Post, new { id = "frmAsset"})) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

<div class="tempStyle"> 
    <div class="editor-label fl"> 
     @Html.LabelFor(model => model.AssetName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.AssetName) 
     @Html.ValidationMessageFor(model => model.AssetName) 
    </div> 
</div> 
<div style="position: relative;"> 
    <input type="submit" value="Save" id="btnSave" /> 
</div> 

然后你可以用下面的JavaScript:

$(function(){ 
    $("#frmAsset").submit(function(evt){ 
     var form = $(evt.currentTarget); 

     if(form.validate().isvalid() 
     { 
      // your handler here 
     } 
     evt.preventDefault(); // prevent the form from posting normally 
     return false; 
    }; 
}; 

我会看着AJAX.BeginForm帮手,它更适合于你是什么在这里做。

nb。我没有在ide中输入这个,所以我不知道它是否是100%有效的,你需要测试它。