2012-03-19 3 views
0

Я пытаюсь использовать .ajax() для отправки объекта People в действие MVC2, которое ожидает параметр ViewModel как параметр. ViewModel имеет свойство People.Передача объекта jQuery на действие MVC

Проблема в том, что когда действие MVC активировано, объект ajax() postback People всегда имеет значение null. Я использовал Fiddler для диагностики проблемы. Значения свойств в объекте People содержатся в заголовке. Вот мой сценарий jQuery для клиента. Обратите внимание, что я использовал три метода для заполнения значений свойств объекту People, но ни один из них не работает.

 StaffDlg.delegate("#SaveButton", "click", 
     function (e) { 
      e.preventDefault(); 

      People["PKey"] = $("#PKey").val(); 
      People["FName"] = $("#FName").val(); 
      People["LName"] = $("#LName").val(); 
      People["MName"] = $("#MName").val(); 
      People["SSN"] = $("#SSN").val(); 
      People["Gender"] = $("#Gender").val(); 
      People["DOB"] = $("#DOB").val(); 
      People["BirthPlace"] = $("#BirthPlace").val(); 
      People["NetworkAccount"] = $("#NetworkAccount").val(); 

      var pkey = $("#PKey").val(); 
      var action; 

      if (!isNaN(parseFloat(pkey)) && isFinite(pkey)) { 
       action = "Edit" + "/" + pkey; 
      } 
      else { 
       action = "Create"; 
      } 

      $.ajax({ 
       url: getRootUrl() + "/Staff/" + action, 
       //data: { FName: $("#FName").val(), LName: $("#LName").val(), MName: $("#MName").val(), 
       // SSN: $("#SSN").val(), Gender: $("#Gender").val(), DOB: $("#DOB").val(), 
       // BirthPlace: $("#BirthPlace").val(), NetworkAccount: $("#NetworkAccount").val() 
       //}, 
       //data: JSON.stringify(People), 
       data: $("Form").serialize(), 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       type: "POST", 
       success: function (result) { 
        $("#ajaxResponse").addClass("whiteOnGreen").html("Update succeeded"); 
       }, 
       error: function (qXHR, textStatus, errorThrown) { 
        $("#ajaxResponse").addClass("whiteOnRed").html("Failed to save the record!\r\n" + 
         textStatus + ": " + errorThrown + "\r\n" + 
         "data : " + JSON.stringify(People)); 
       } 
      }) 
     } 
    );  

и вот действие MVC.

public ActionResult Edit(int id, StaffViewModel updatedStaff) 
    { 
     People staff = _staffService.GetStaff(id); 

     if (updatedStaff == null) 
      return View("NotFound"); 
     if (ModelState.IsValid) 
     { 
      TryUpdateModel<People>(staff, "staff"); 
      staff.RecordLastUpdated = DateTime.Now; 
      staff.UpdatedBy = HttpContext.User.Identity.Name; 
      _staffService.SaveStaff(); 
      //return RedirectToAction("Index", new { id = thisStaff.PKey }); 

      if (Request.IsAjaxRequest()) 
       return this.Json(staff, JsonRequestBehavior.AllowGet); 
      else 
      { 
       if (string.IsNullOrEmpty(updatedStaff.previousURL)) 
        return Redirect("/Staff/Startwith/" + staff.LName.Substring(1, 1)); 
       else 
        return Redirect(updatedStaff.previousURL); 
      } 
     } 
     else 
     { 
      if (Request.IsAjaxRequest()) 
      { 
       string errorMessage = "<div class='whiteOnRed error'>" 
        + "The following errors occurred:<ul>"; 
       foreach (var key in ModelState.Keys) 
       { 
        var error = ModelState[key].Errors.FirstOrDefault(); 
        if (error != null) 
        { 
         errorMessage += "<li>" 
          + error.ErrorMessage + "</li>"; 
        } 
       } 
       errorMessage += "</ul></div>"; 
       return Json(new { Message = errorMessage }); 
      } 
      else 
       return View(updatedStaff); 
     } 
    } 
+0

Hiya, вы заглянули в MVC ajax в .net - ajax call to action - http://www.asp.net/mvc/tutorials/contact-manager/iteration-7-add-ajax-functionality -cs cheers –

ответ

0

Я решил проблему с .ajax() не размещая значения формы в MVC Создание (Люди лица) действия. Это был тип параметра, который отличается от типа, используемого в Edit (StaffViewModel). Теперь оба действия принимают один и тот же параметр, StaffViewMode.

0

Вы утверждаете, что форма ожидает StaffViewModel в качестве параметра, и StaffViewModel имеет свойство People ... но вы не передавая полный объект StafFViewModel - вместо того, чтобы вы передаете объект Людей из вызова Ajax , и надеясь, что свойство People заселяется на конец MVC.

Существует разъединение, и автоматическое связывание не знает, как его скрепить.

Попробуйте создать метод контроллера с подписью (int, People) и посмотреть, работает ли это для вас.

В противном случае вам может потребоваться создать собственное связующее.

+0

Согласно этому сообщению http://stackoverflow.com/questions/1160669/can-jquery-do-a-post-of-a-viewmodel-to-a-controller-in-asp-net-mvc, это также не нужно создавать. MVC должен иметь возможность просверлить свойство People в ViewModel и связать его свойства с пользователем .ajax(). – user266909

0

Попробуйте удалить DATATYPE и CONTENTTYPE настройки из АЯКС вызова:

$.ajax({ 
    url: getRootUrl() + "/Staff/" + action, 
    data: $("Form").serializeArray(), 
    type: "POST", 
    success: function (result) { 
     $("#ajaxResponse").addClass("whiteOnGreen").html("Update succeeded"); 
    }, 
    error: function (qXHR, textStatus, errorThrown) { 
     $("#ajaxResponse").addClass("whiteOnRed").html("Failed to save the record!\r\n" + 
      textStatus + ": " + errorThrown + "\r\n" + 
      "data : " + JSON.stringify(People)); 
    } 
}) 
+0

Я получил данные формы, связанные с действием MVC Edit (int id, StaffViewModel updatedStaff). Тем не менее, я до сих пор не могу получить данные формы, связанные с действием Create (People person). Функция .ajax() проверяет $ ("# PKey"). Val(), чтобы определить, какое действие следует отправить. Знаете ли вы, почему это не вызвано действием Create? Имеет ли значение, что Edit() принимает ViewMode, а Create() принимает только объект People? Благодарю. – user266909

Смежные вопросы