2016-04-21 9 views
2

i MVC-Architektur bin mit, habe ich eine POST-Form als Bootstrap Modal, das seine Form Daten nach zu einer AJAX-Aufruf einreichen anhängen-Controller liefert JSON-Objekt als Ansicht

$.ajax({ 
    type: "POST", 
    url: action, 
    enctype: "multipart/form-data", 
    data: dataString, 
    cache: false, 
    contentType: contentType, 
    processData: processData, 
    beforeSend: function() { 
     block('#mymodal'); 
    }, 
    success: function (data, status, xhr) { console.log("success ajax"); onAjaxSuccess(xhr, status, '#mymodal') }, 
    error: function (xhr, status) { console.log("error ajax"); onAjaxFailed(xhr, status, error, '#error-div') }, 
    complete: function (xhr, status) { console.log("complete ajax"); onAjaxComplete(xhr, status, '#mymodal', '#alert', '#myModal') } 
}); 

wo Aktion das ist Controller-Methode, wo er die erforderlichen Daten übergibt, content und verarbeite sind beide falsch

Dieser ajax Anruf arbeitet gut und sendet den Anruf an die Steuerung korrekt

012.
public ActionResult MyCtroller(myViewModel model) 
{ 
    //processing stuff 

    JsonResultObject result = new JsonResultObject(); 

    try 
    { 
     //return secess 
    } 
    catch (Exception ex) 
    { 
     //return error 
    } 

    SearchCriteria<MyModel> viewModel = new SearchCriteria<MyModel>(); 
    viewModel.SortExpression = m => m.OrderByDescending(a => a.Date); 
    SearchResult<MyModel> searchResult = MyModelService.Instance.Search(viewModel); 

    result.PartialViewHtml = RenderPartialViewToString("PartialView.cshtml", searchResult); 


    return Json(result)); 
} 

nachdem die Verarbeitung abgeschlossen ist, und es ist Zeit, um die Seite es das Ergebnis als reine JSON mit der Teilansicht in diesem JSON als Objekt, statt Rendern die PartialView und den Erfolg, vollständig, Fehler drucken zurückzukehren in der Anruf Ajax früher erhalten

nicht
{ 
    "IsRedirect": false, 
    "RedirectUrl": null, 
    "Success": true, 
    "AlertMessage": { 
    "IsAutoHide": false, 
    "Dissmisable": true, 
    "ShowIcon": false, 
    "Message": "success", 
    "AlertCSS": "alert alert-success", 
    "AlertType": 3, 
    "AlertTypeMetronic": "success" 
}, 
"PartialViewHtml":"-----partialView HTML code-----" 
} 

Antwort

0

Sie sollten Json rufen direkt mit den Daten, die Sie zu serialisieren beabsichtigen genannt. Der Json Aufruf wird ein JsonResult Objekt zurückgeben, also übergeben Sie es nicht eine Instanz von JsonResult. Wenn Sie JsonResult direkt verwenden möchten, geben Sie das ohne den zusätzlichen Aufruf an Json zurück. Verwenden Sie die Überlast von Json mit dem Parameter JsonRequestBehavior.

[HttpPost] 
public ActionResult MyCtroller(myViewModel model) 
{ 
    var result = new ActualInstanceOrContainerToBeReturned; 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

Auch ich bin nicht sicher, warum Sie den Blick in den JsonResult zurückkehren möchte, damit ich nicht außer Kommentar zu sagen, dass schlechtes Design sein könnte. Im Interesse des SOC müssen die Daten und die Sicht getrennt gehalten werden (dies schließt die Generierung dieser Elemente ein).

0

Ich glaube, Sie brauchen Ihren Controller

public ActionResult MyCtroller(myViewModel model) 
{ 
    //processing stuff 

    JsonResultObject result = new JsonResultObject(); 

    try 
    { 
     //return secess 
    } 
    catch (Exception ex) 
    { 
     //return error 
    } 

    SearchCriteria<MyModel> viewModel = new SearchCriteria<MyModel>(); 
    viewModel.SortExpression = m => m.OrderByDescending(a => a.Date); 
    SearchResult<MyModel> searchResult = MyModelService.Instance.Search(viewModel); 

    // result.PartialViewHtml = RenderPartialViewToString("PartialView.cshtml", searchResult); 

    // If you want to render as html partial view 

    return PartialView("PartialView.cshtml", searchResult); 

    // return Json(result)); 
} 

und Javascript-Code ändern

$.ajax({ 
      type: "POST", 
      url: action, 
      enctype: "multipart/form-data", 
      data: dataString, 
      cache: false, 
      contentType: contentType, 
      processData: processData, 
      beforeSend: function() { 
       block('#mymodal'); 
      }, 
      success: function (data, status, xhr) { 
        console.log("success ajax"); 
        onAjaxSuccess(xhr, status, '#mymodal') 
        $("#YOUR_DIV_ID").html(data); 
      }, 
      error: function (xhr, status) { console.log("error ajax"); onAjaxFailed(xhr, status, error, '#error-div') }, 
      complete: function (xhr, status) { console.log("complete ajax"); onAjaxComplete(xhr, status, '#mymodal', '#alert', '#myModal') } 
     }); 
Verwandte Themen