2012-03-06 75 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