【问题标题】:MVC partial view or base viewmodel for multiple controllers showing same data?显示相同数据的多个控制器的 MVC 部分视图或基本视图模型?
【发布时间】:2017-01-24 11:42:04
【问题描述】:

我(终于)从 WebForms 迁移到 MVC 并且出现了问题,似乎我找不到好的解决方案...

假设我在 _layout.cshtml 页面中有一个“小部件”,它显示登录用户的最后 4 条消息。这存在于网站的每个控制器中。

我应该如何进行?

a) BaseViewModel:对于每个控制器和每个操作,我必须创建从 BaseViewModel 继承的特定视图模型,并且在每个控制器中我设置数据 + baseviewModel 中的最后 4 条消息:

public ActionResult Index()
{
   HomeViewModel h = new HomeViewModel();
   h.UserName = "Daniele"; //in BaseViewModel
   h.LastMessages = _messagesRepository.GetLastItems(4); //in BaseViewModel

   //Other data specific to index page

   return View(h);
}

public ActionResult Dashboard()
{
   HomeViewModel h = new HomeViewModel();
   h.UserName = "Daniele"; //in BaseViewModel
   h.LastMessages = _messagesRepository.GetLastItems(4); //in BaseViewModel

   //Other data specific to dashboard

   return View(h);
}

b) Html Action: 似乎是一个更好的解决方案,但在每个控制器中我仍然需要复制和粘贴

[ChildActionOnly]
public PartialViewResult LastMessages()
{
  //Code
}

在我将创建的每个控制器中。

最好的做法是什么?建议? 感谢您的帮助。

【问题讨论】:

  • 您可以使用Html.Action指定控制器
  • 使用[ChildActionOnly]方法,但它只需要在你的一个控制器中(比如MessagesController),然后在布局中使用@{ Html.RenderAction("LastMessages", "Messages"); }

标签: c# asp.net-mvc model-view-controller asp.net-mvc-5


【解决方案1】:

a) 在 2017 年我强烈建议您查看 angular.js 或 react js

b) 如果没有,请将 jQuery 添加到项目中。创建一个将在$(document).ready() 调用将提供 4 个项目的 ONE 操作的部分。 这段代码只会存在一次,并且可以在任何地方工作。

【讨论】:

  • 有趣!但是.. 只是出于好奇,如果我想避免使用 javascript,a 和 b 是唯一可用于解决我的问题的 2 个选项吗?谢谢。
  • 我现在看到你给了我两个选项的答案。在您看来,哪一个是最好的开始? A 还是 B?
  • @DanieleArrighi 如果您想避免使用 JavaScript,您可以尝试使用带有代码的 ASP.Net 控件并呈现它。不幸的是,我在这方面的专业知识不是很好,所以我无法解释太多。就开始而言 - 取决于您已经拥有多少。如果您的项目超过 40%,只需添加 jQuery。您可以使用它轻松地扩充 MVC 视图,并且它不会改变代码工作方式的基本原则。如果您刚刚开始,请考虑是否有额外的一个月可以添加到时间线中,如果有,请从前端框架开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多