ASP.NET MVC通用部分视图模式

时间:2011-02-16 18:12:05

标签: asp.net-mvc asp.net-mvc-3 razor partial-views

我有一个部分观点,我想要是通用的。根据{{​​3}},部分视图不能是通用的。所以我做了一个HtmlHelper扩展,处理我想要类型安全的部分,然后将其余部分交给真正的局部视图。

通常我的助手在页面加载时被调用,这很好,但有时候我想通过AJAX添加一行或者其他东西。发生这种情况时,控制器无法使用我的“部分视图”,因为它无法访问HtmlHelper。

除了使用类型为object的模型的部分视图外,还有什么我可以做的吗?

我正在使用Razor,如果这很重要的话。

我正在做的简化版本:

public static MvcHtmlString DoStuff<T>(this HtmlHelper html, IEnumerable<T> data,
   Func<T, ViewModelType> StronglyTypedFn, string PartialName)
  {
  // the pre- and post-processing for the partial view is complex enough I'd like
  // to encapsulate it. But I want the encapsulation to include the safety 
  // benefits that generics give.
  var mappedData = data.Select(StronglyTypedFn);
  string htmlData = "";
  foreach(var model in mappedData){
    htmlData += html.Partial(PartialName, model);
  }
  htmlData += "some boilerplate footer html";
  return htmlData;
}

我意识到在这个例子中我在局部视图之外只有很少的代码行,因此有一个帮助器似乎没有意义,但在我的实例中它更复杂。

现在,在ajax调用中,我想返回Html.DoStuff()。但我不能,因为这需要访问HtmlHelper,并且控制器内没有帮助器。

2 个答案:

答案 0 :(得分:0)

您可以使用一个简单的操作方法来调用一个模型实例的部分

public PartialViewResult Single(string partialName) {
    return PartialView(partialName);
}

答案 1 :(得分:0)

您可以使用具有动态类型的视图而不是对象。

但是......似乎这里存在一些误解,因为Controller根本不应该尝试渲染视图。你能发布控制器代码吗?

更好的选择是,IMO,为您的ajax请求返回一个JsonResult,并使用JS在客户端添加行/。