我认为重要的是,为了将这些额外信息添加到视图中,不应该为创建控制器方法添加任何开销.这排除了在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隐喻,但有点麻烦.
>有其他人提出了更好的解决方案
>哪个最好 – 如果你使用过它们有效/有问题吗?
他讨论了使用剃刀使用“部分”,这将使你在你的布局(“母版页”)上创建一个可以加载内容的部分.以这种方式创建SO样式信息栏将是简洁的.
编辑:
至于根据下面的评论渲染部分视图……新的mvc music store tutorial有一些例子.
在这种情况下,他们使用HTML.RenderAction. HTML.RenderPartial是另一种选择.
这个差异在question中被淘汰,但我确定网上还有其他资源.
您的控制器将返回部分视图:
return PartialVIEw();总结
以上是内存溢出为你收集整理的c# – MVC – 将其他信息传递给视图全部内容,希望文章能够帮你解决c# – MVC – 将其他信息传递给视图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)