我有一个母版页需要显示我的数据库中的一些数据。例如,我在页面中有一个标题,显示用户拥有的消息/警报的数量。每个控制器都需要将此数据传递给View。在MVC应用程序中执行此操作的最佳方法是什么。我显然不想在每个控制器动作中复制代码。
答案 0 :(得分:3)
您可以使用子操作。 Phil Haack在blog post中做了很好的解释。这样,您将拥有一个特定的控制器,用于从存储库中获取数据并将其传递给自己的部分视图。然后在您的母版页中,您只需添加操作:
<%= Html.Action("index", "somecontroller") %>
这样,其他控制器不需要将数据传递给视图。它有一个完全独立的生命周期。
答案 1 :(得分:2)
Darin的答案的另一种选择是ActionFilterAttribute
,它将数据插入到每个Action的ViewData中。放置属性的位置定义了哪些操作可以获得此操作。将它放在根控制器类中意味着所有操作都将获得它。
答案 2 :(得分:2)
您可以拥有一个所有模型都继承自的模型:
public abstract class MasterModel
{
public int NumberOfMessages { get; set; }
public string Username { get; set; }
}
然后您可以使用某种模型工厂来创建所请求的模型:
public class ModelFactory : IModelFactory
{
private IUserRepository userRepository;
public ModelFactory(IUserRepository userRepository)
{
// Inject a repository .. or a service...
this.userRepository = userRepository;
}
public T Create<T>() where T : MasterModel, new()
{
var m = new T()
{
NumberOfMessages = this.userRepository.GetNumberMessages(currentUser) // Get current user somehow... HttpContext
};
return m;
}
}
然后你将IModelFactory注入你的控制器,然后在动作中使用它:
[HttpGet]
public ViewResult DoSomething()
{
var model = this.modelFactory.Create<MyActionModel>();
return View(model);
}
然后您的主人具有MasterModel
模型类型,然后可以使用此信息。这样,您的所有逻辑都可以保存在注入工厂的服务/存储库中,从而创建每个视图的模型。这就是我所做的,而且效果很好。