c# - MVC - 将附加信息传递给 View

标签 c# asp.net-mvc asp.net-mvc-2

我正在使用 Asp.Net MVC 框架开发一个网站。我们需要在多个页面中添加一般用户信息,其方式类似于堆栈溢出顶部的信誉栏。

我认为重要的是,为了将此额外信息添加到 View ,不应在创建 Controller 方法时增加开销。这排除了在 ViewData 对象中传递此信息或修改 ViewModels 以接受信誉字段的选项,因为这会导致每个 Controller 看起来像这样:

public ActionResult Index()
{
    ViewData["reputationScore"] = GetUsersReputation(userId);

    // main controller logic here
}

如果网站上 90% 的页面都使用它,如果我们还想显示用户徽章计数,那么更改可能会非常耗时。

我可以想到 4 种解决方案

使用母版页 在后面的母版页代码中检索用户信誉,并在母版页标记中为信誉标记。

缺点:

  1. 这似乎正在远离 MVC 所代表的一切。
  2. 我一直在考虑转向使用其他 View 引擎(例如 razor),但我不确定这些引擎的混合效果如何。
  3. 它往往会限制声誉的布局 - 很难将其放在页面中间。

扩展 HtmlHelper 以添加 GetUsersReputation 方法 这似乎稍微违反了 Html 对象的用途——它不仅仅是渲染输出,而是访问数据库。除了违反隐喻之外,我想不出任何其他重要问题。

覆盖 System.Web.Mvc.ViewPage 覆盖 Viewpage 以公开除 Html 之外的对象,该对象可用于调用访问数据库的一系列方法。确保可以以与 HtmlHelper 相同的方式添加扩展方法,以便在需要新方法时可以适本地扩展它。这可以让我们写出类似的东西:

<% DataAccess.GetUsersReputation() %>

创建一个基本的通用 View 模型 不要将你的 View 模型直接传递给 View ,而是将它包装在一个可以包含你需要的所有方法的基础 View 模型中:

public ActionResult Index()
{
    MyViewModel viewCoreInfo = model.GetData();

    return View(new BaseViewModel<MyViewModel>(viewCoreInfo));
}

BaseViewModel 可以公开网页所需的额外信息所需的所有属性。例如UsersReputation(它可以在构造函数中查询数据库,或者在访问属性时加载数据)。我认为这更好地维护了 MVC 隐喻,但有点麻烦。

  1. 有没有其他人提出更好的解决方案
  2. 哪个最好 - 如果您使用过它们,它们是否有效/有问题?

最佳答案

既然你提到了迁移到 razor View 引擎的可能性,我认为 THIS可能会对 ScottGu 的博文感兴趣。

他讨论了将“部分”与 razor 一起使用,这将允许您在布局(“母版页”)上创建一个部分,您可以加载其他内容。以这种方式创建您的 SO 风格信息栏会很干净和简单。

编辑:

至于根据下面的评论呈现部分 View ...新的 mvc music store tutorial有一些例子。

在这种情况下,他们使用 Html.RenderAction。 Html.RenderPartial 是另一种选择。 question 中列出了差异但我确定网上还有其他资源。

你的 Controller 只会返回一个局部 View :

 return PartialView();

关于c# - MVC - 将附加信息传递给 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4898286/

相关文章:

c# - .NET Core Web Deploy to production 在发布时关闭站点?

asp.net-mvc-2 - 自定义错误页面不显示

c# - CustomAuthorizationPolicy.Evaluate() 方法永远不会在 wcf webhttpbinding 中触发

c# - Parallel Linq - 返回第一个返回的结果

c# - tabcontrol ownerdraw 更改 tabcontrol 的边框样式

c# - ASP.NET MVC 5 Identity with Model First

c# - 设置代理 Windows IOT Core

asp.net-mvc - C# MVC FindPartialView 找不到路径

asp.net - 启动时缓存表 ASP.NET MVC 应用程序

c# - ASP.Net MVC2 (RTM) 中断响应过滤 - "Filtering is not allowed"