c# – MVC – 将其他信息传递给视图

c# – MVC – 将其他信息传递给视图,第1张

概述我正在使用Asp.Net MVC框架开发一个网站.我们需要在多个页面中添加一般用户信息,方式与堆栈溢出顶部的信誉栏类似. 我认为重要的是,为了将这些额外信息添加到视图中,不应该为创建控制器方法添加任何开销.这排除了在ViewData对象中传递此信息或修改ViewModel以接受信誉字段的选项,因为它会导致每个控制器看起来像这样: public ActionResult Index(){ 我正在使用Asp.Net MVC框架开发一个网站.我们需要在多个页面中添加一般用户信息,方式与堆栈溢出顶部的信誉栏类似.

我认为重要的是,为了将这些额外信息添加到视图中,不应该为创建控制器方法添加任何开销.这排除了在VIEwData对象中传递此信息或修改viewmodel以接受信誉字段的选项,因为它会导致每个控制器看起来像这样:

public ActionResult Index(){    VIEwData["reputationscore"] = GetUsersReputation(userID);    // main controller logic here}

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

我能想到4个解决方案

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

缺点:

>这似乎正在远离MVC所代表的一切.
>我一直在寻找使用替代视图引擎(例如剃须刀)我不确定这些将如何混合.
>它倾向于限制声誉的布局 – 很难将其放在页面中间.

扩展HTMLHelper以添加GetUsersReputation方法
这似乎是对HTML对象应该使用的内容的轻微违反 – 它不仅仅是渲染输出,而是命中数据库.除了违反隐喻之外,我无法想到除此之外的任何其他重大问题.

重写System.Web.Mvc.VIEwPage
重写VIEwpage以暴露除HTML之外的对象,该对象可用于调用访问数据库的一系列方法.确保可以使用与HTMLHelper相同的方式添加扩展方法,以便在需要新方法时,可以适当地扩展它.这可以让我们写下这样的东西:

<% DataAccess.GetUsersReputation() %>

创建基础通用视图模型
而不是将视图模型直接传递给视图,而是将其包装在可以包含所需方法的基本视图模型中:

public ActionResult Index(){    Myviewmodel vIEwCoreInfo = model.GetData();    return VIEw(new Baseviewmodel<Myviewmodel>(vIEwCoreInfo));}

Baseviewmodel可以公开您需要的所有属性,以获取网页上所需的额外信息.例如UsersReputation(它可以在构造函数中查询数据库,也可以在访问属性时加载数据).我认为这可以更好地保持MVC隐喻,但有点麻烦.

>有其他人提出了更好的解决方案
>哪个最好 – 如果你使用过它们有效/有问题吗?

解决方法 既然你提到了转移到剃刀视图引擎的可能性,我认为ScottGu的 THIS博客文章可能会引起人们的兴趣.

他讨论了使用剃刀使用“部分”,这将使你在你的布局(“母版页”)上创建一个可以加载内容的部分.以这种方式创建SO样式信息栏将是简洁的.

编辑:

至于根据下面的评论渲染部分视图……新的mvc music store tutorial有一些例子.

在这种情况下,他们使用HTML.RenderAction. HTML.RenderPartial是另一种选择.
这个差异在question中被淘汰,但我确定网上还有其他资源.

您的控制器将返回部分视图:

return PartialVIEw();
总结

以上是内存溢出为你收集整理的c# – MVC – 将其他信息传递给视图全部内容,希望文章能够帮你解决c# – MVC – 将其他信息传递给视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216541.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存