MVC母版页动态数据

时间:2010-12-15 15:49:06

标签: c# asp.net-mvc master-pages

我有一个母版页需要显示我的数据库中的一些数据。例如,我在页面中有一个标题,显示用户拥有的消息/警报的数量。每个控制器都需要将此数据传递给View。在MVC应用程序中执行此操作的最佳方法是什么。我显然不想在每个控制器动作中复制代码。

3 个答案:

答案 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模型类型,然后可以使用此信息。这样,您的所有逻辑都可以保存在注入工厂的服务/存储库中,从而创建每个视图的模型。这就是我所做的,而且效果很好。