背景
我正在开发一个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部分相同。如何使用上述方法更新我的部分?
答案 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/