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

4
我有一个部分视图需要变成通用的。根据这个问题,部分视图无法变成通用的。我写了一个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;
}

我意识到在这个例子中,除了局部视图外,我几乎没有代码行,因此似乎没有必要使用helper,但在我的实际例子中,情况更为复杂。

现在,在一个ajax调用中,我想返回Html.DoStuff()。但是我无法这样做,因为这需要访问HtmlHelper,而在控制器内部无法使用helper。


@marcind:我想在 AJAX 情况下调用这个确切的辅助函数。 - Xodarap
2
我认为你可以创建一个新的操作方法,该方法将调用单个项目的帮助程序。这对你有用吗? - marcind
@marcind:怎么办?控制器没有访问HtmlHelper的权限,对吗? - Xodarap
@Xodarap - 这个问题中的混淆是:您想使用AJAX做什么?您能发布一下AJAX代码吗?这将有助于我们回答这个问题。例如,AJAX代码是在所有内容的中间插入HTML,还是使用DoStuff方法刷新整个HTML部分? - Remus
不是针对你的问题,但这会帮助你:在你的辅助类中,使用 StringBuilder 实例代替 html+= 可以提高性能。 - smartcaveman
显示剩余4条评论
2个回答

0

你可以只有一个简单的操作方法,调用部分视图来控制一个模型实例

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

谢谢你的回答,但问题是我想要返回整个 helper 的结果。所以对于我的例子,我想要返回 Html.DoStuff()。(除非我完全误解了你的建议...?) - Xodarap
我可能误解了你的问题。也许你可以通过提供第一页加载时所需输出与ajax请求所需输出的示例来补充你的问题。 - marcind
我觉得我的问题不太清楚。我想要在页面加载和ajax上完全相同的东西。我会编辑这个问题。 - Xodarap

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接