2013-06-26 4 views
0

Я использую нокаут в первый раз, и я изо всех сил пытаюсь решить проблему.Индикатор проверки нокаута MVC и

У меня есть страница с несколькими разделами и вы хотите иметь возможность редактировать раздел и отправлять его на контроллер, а затем отображать сохраненные детали.

Каждая секция представляет собой частичный вид, который содержит отображаемую информацию и форму. Они отображаются и скрываются по мере необходимости. У меня есть код, который работает для отправки, но проблема в том, что ModelState недействителен. Мне нужно вернуться к форме с отображаемым сообщением о проверке

Как я могу отобразить форму еще раз, когда проверка сервера не удалась? Когда проверка не выполняется, она возвращается в раздел дисплея.

Также я заметил, что сообщение проверки не отображается.

Я уверен, что это должна быть общая проблема с простым исправлением. Я знаю, что есть инструменты проверки нокаута, но позже вам нужно будет выполнить более сложную проверку бизнес-логики и заставить эту технику работать.

ViewModel:

[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> 

Нокаут ViewModel:

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); 
       } 
      } 

Так что теперь, если проверка на стороне сервера не удалось, вид будет показывать форму и ошибки проверки.