2013-06-26 91 views
0

我第一次使用基因敲除,而我正在努力解決問題。MVC基因敲除驗證顯示和

我有一個包含多個部分的頁面,希望能夠編輯一個部分並提交給控制器,然後顯示保存的詳細信息。

每個部分是包含顯示信息和表單的局部視圖。它們根據需要顯示和隱藏。我的代碼工作提交,但問題是當ModelState無效。我需要返回到顯示驗證消息的表單

如何在服務器驗證失敗時再次顯示錶單?當驗證失敗時,它當前返回到顯示部分。

另外我注意到驗證消息不顯示。

我相信這肯定是一個簡單修復的常見問題。我知道有基因敲除驗證工具,但後來需要做更復雜的業務邏輯驗證,並需要使這項技術發揮作用。

視圖模型:

[Required] 
    public DateTime? InterviewDate { get; set; } 

查看:

<div data-bind="if: showAdminInterviewDisplay" id="Display"> 
<div> 
    <button data-bind="click: showInterviewForm" id="EditButton">Edit</button> 
</div> 
<div> 
    @Html.Label("Inteview Date") : 
    <label data-bind="text: interviewDate"></label> 
</div> 
</div> 
<div data-bind="if: showAdminInterviewForm" id="Form"> 
<div> 
    @Html.Label("Interview Date") 
    <input data-bind="value: interviewDate" id="interviewDatePicker" /> 
    @Html.ValidationMessageFor(m => m.InterviewDate) 
</div> 

<div> 
    <button data-bind="click: saveInterviewDate">Submit</button> 
</div> 

淘汰賽視圖模型:

function InterviewViewModel() { 
    //Data 
    var self = this; 
    var jsonDate = @Html.Raw(Json.Encode(@Model.InterviewDate)); 
    var date = new Date(parseInt(jsonDate.substr(6))); 

    self.interviewDate = ko.observable(dateFormat(date, "dd/mm/yyyy"));   
    self.showAdminInterviewDisplay = ko.observable(true); 
    self.showAdminInterviewForm = ko.observable(); 

    self.showInterviewForm = function() { 
     self.showAdminInterviewDisplay(false); 
     self.showAdminInterviewForm(true); 
     $("#interviewDatePicker").datepicker({dateFormat: 'dd/mm/yy'}); 
    }; 

    //Operations 
    self.saveInterviewDate = function() { 
     $.ajax("@Url.Action("SaveInterview")", { 
      data: ko.toJSON(self), 
      type: "post", 
      contentType: "application/json", 
      success: function(data) { 
       self.showAdminInterviewDisplay(true); 
       self.showAdminInterviewForm(false); 
      } 
     }); 
    }; 
}; 

ko.applyBindings(new InterviewViewModel()); 

控制器:

 public ActionResult SaveInterview(KnockoutViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      return Json(model); 
     } 
     return PartialView("_AdminInterview", model); 
    } 

回答

0

而不是從您的操作方法返回一個部分視圖,返回一個序列化的錯誤模型到AJAX調用中的成功函數。錯誤模型將包含ModelState中的所有錯誤。

參見如何得到這一職位,並使用來自模型狀態錯誤: ASP.NET MVC How to convert ModelState errors to json(JK的答案)

所以,你會碰到這樣的:

誤差模型:

public class JsonErrorModel 
{ 
    public JsonErrorModel() 
    { 
     HasFailed = true; 
    } 

    public bool HasFailed { get; set; } 
    public IEnumerable ErrorList { get; set; } 
} 

控制器:

if(ModelState.IsValid) 
{  
    //Do whatever here 
    return Json(new { model }); 
} 

return Json(new JsonErrorModel {ErrorList = ModelState.Errors()}); 

Succes s功能的AJAX調用:

success: function (result) {      
       if(result.HasFailed) { 
        self.showAdminInterviewDisplay(false); 
        self.showAdminInterviewForm(true); 
        DisplayErrors(result.ErrorList); 
       } 
       else { 
        self.showAdminInterviewDisplay(true); 
        self.showAdminInterviewForm(false); 
       } 
      } 

所以,現在,如果服務器端驗證失敗,視圖將顯示窗體和驗證錯誤。