无法将部分视图返回到jQuery.ajax调用

时间:2012-03-06 23:14:08

标签: asp.net-mvc json jquery partial-views

背景

我正在开发一个ASP.NET MVC应用程序,它在主页面上有3个部分(基于Razor引擎)。第一部分具有用户填写的搜索条件列表。第二部分应该根据传入的数据显示ParameterParts列表。第三部分应该根据传入的数据显示规范列表。我需要调用Controller中的方法来填充我的第二和第三部分视图。

问题:

所有三个部分的父视图(index.cshtml)的代码

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

第一部分代码(_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>

我不包括第3部分,因为它与第2部分相同。如何使用上述方法更新我的部分?

2 个答案:

答案 0 :(得分:5)

 dataType: 'dataToPass',
 data: json,

dataType是您期望从服务器返回的数据类型。如果你要返回html,那不应该是json。

数据是要发送到服务器的数据。

更新

你错过了#,你的选择器不正确。如果您的HTML是这样的:

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

你的代码应该是这样的:

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

答案 1 :(得分: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/