2012-03-06 76 views
3

背景:無法PartialView返回到jQuery.ajax呼叫

我上有3個諧音的ASP.NET MVC應用程序的工作(基於剃刀引擎)的主頁上。第一個部分有一個用戶填充的搜索條件列表。第二部分應該根據傳入的數據顯示ParameterParts的列表。第三部分應該根據傳入的數據顯示規格列表。我需要調用Controller中的方法來填充我的第二和第三部分視圖。

問題:

代碼用於所有三個泛音

<div class="prepend-top span-24 last" id="searchPage"> 
    <div class="span-24 last"> 
     @Html.Partial("_Search") 
    </div> 
    <div class="span-24 last" id="parameterResults"> 
     @Html.Partial("_ParameterParts") 
    </div> 
    <div class="span-24 last" id="searchSpecResults"> 
     @Html.Partial("_Specifications") 
    </div> 
</div> 

代碼的第一部分的父視圖(index.cshtml)(_Search.cshtml):

// Post the object to the server using jQuery 
$.ajax({ 
    url: '@Url.Action("ParameterParts")', 
    type: 'POST', 
    dataType: 'html', 
    data: dataToPass, 
    error: function (data) { alert('Something Went Wrong'); }, 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert('Success P'); 
     $("parameterResults").html(data); 
    } 
}); 

此代碼通過dataToPass參數正確調用ParameterParts方法。

這裏是我使用用於控制器方法的代碼:

[HttpPost] 
public ActionResult ParameterParts(CriteriaViewModel vm) 
{ 
    List<ParameterPart> parameterParts = new List<ParameterPart>(); 

    //Some logic to populate parameterParts using the passed in object 

    return PartialView("_ParameterParts", parameterParts); 
} 

代碼的第二部分:

@model IEnumerable<SmartPlex.Web.SmartPlex.ODataService.ParameterPart> 

<table> 
    <tr> 
     <th> 
      Part Number 
     </th> 
     <th> 
      Description 
     </th> 
    </tr> 
    @if (Model != null) 
    { 
     foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.PartNumber) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Description) 
       </td> 

      </tr> 
     }      
    } 
</table> 

我不包括第三部分,因爲它是與第二個相同。如何使用上述方法更新我的偏好?

回答

5
dataType: 'dataToPass', 
data: json, 

數據類型是你期望從服務器返回的數據類型。如果你正在返回html,那不應該是json。

數據是數據要被髮送到服務器。

更新:

您缺少#,您的選擇器不正確。如果您的HTML是這樣的:

<div class="span-24 last" id="parameterResults"> 
    @Html.Partial("_ParameterParts") 
</div> 

你的代碼應該是這樣的:

$("#parameterResults").html(data); 
+0

感謝BZ的信息。我修改了我的ajax調用來期望HTML返回,現在如果我提醒正在返回的數據,我會得到正確的html。不過,我仍然無法呈現$(「parameterResults」)div內的html。看來$(「parameterResults」).html(data)沒有做任何事情。 – Yasir 2012-03-06 23:51:20

+0

@B Z,我已經添加了主視圖和第二部分代碼,如果有幫助的話。 – Yasir 2012-03-07 00:38:45

+0

是啊...選擇器是錯的。不能相信我無法自己發現。萬分感謝。 – Yasir 2012-03-07 00:53:23

1

你不需要一個單獨的庫來渲染爲字符串部分景色。創建一個擴展方法是這樣的:

public static class RazorViewToString 
{ 
    public static string RenderRazorViewToString(this Controller controller, string viewName, object model) 
    { 
     if (controller==null) 
     { 
      throw new ArgumentNullException("controller", "Extension method called on a null controller"); 
     } 

     if (controller.ControllerContext==null) 
     { 
      return string.Empty; 
     } 

     controller.ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

} 

那麼你的控制器中,你可以使用它作爲

return new JsonResult {Data = this.RenderRazorViewToString("partialViewName", model)}; 

然後在客戶端的jQuery的ajax成功回調,只是簡單的附加在你的DOM返回的數據

http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

+0

謝謝@labroo,這給了我需要的html。但是,我無法呈現html,即我無法將返回的數據追加到我的DOM中。我怎麼做? – Yasir 2012-03-07 00:25:32

+0

非常感謝@labroo,您的解決方案完美無缺。但是因爲我只能將一個答案標記爲正確的答案,所以我必須去@B Z,因爲他的方法更直接。 – Yasir 2012-03-07 00:55:24