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

Posted

技术标签:

【中文标题】ASP.NET MVC 通用局部视图模式【英文标题】:ASP.NET MVC Generic Partial View Pattern 【发布时间】:2011-06-28 13:38:51 【问题描述】:

我有一个局部的观点,我想成为通用的。根据this question,部分视图不能是通用的。所以我改为创建了一个 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,而帮助器在控制器中不可用。

【问题讨论】:

我不完全理解你的情况。您能否展示一下这个助手的外观以及您如何从您的视图中调用它? @Darin:我添加了一个示例。可能有更好的方法来完成这与我的做法无关。 那么具体的问题是什么?你的代码看起来不错。您提到“控制器无法使用我的“部分视图”,因为它无法访问 HtmlHelper”,但不清楚您在 AJAX 案例中要做什么。 @marcind:我想在 AJAX 案例中调用这个确切的辅助函数。 我认为你可以有一个新的操作方法来调用单个项目的助手。这对你有用吗? 【参考方案1】:

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

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

【讨论】:

感谢您的回答,但问题是我想返回整个助手的结果。所以对于我的例子,我想返回Html.DoStuff()。 (除非我完全误解了你的建议......?) 我可能误解了你的问题。也许您可以使用您想要的第一页加载输出类型与您想要从 ajax 请求中获得的输出示例来扩充您的问题。 我认为我的问题不清楚。我想要页面加载与 ajax 完全相同的东西。我将编辑问题。【参考方案2】:

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

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

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

【讨论】:

以上是关于ASP.NET MVC 通用局部视图模式的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中使用 jQuery 渲染局部视图

ASP.NET MVC 2 中的局部视图问题

如何将参数传递给 ASP.NET MVC 中的局部视图?

如何在 ASP.NET MVC 中控制局部视图的条件显示

如何从 ASP.NET MVC 控制器的局部视图中读取值

ASP.NET Core MVC:无法在表单标签内呈现字段