2010-12-15 78 views
1

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

回答

2

Darin的答案替代方案是ActionFilterAttribute,它将数据压入每个Action的ViewData。放置属性的位置定义了哪些操作可以实现此目的。将它放在根控制器类上意味着所有操作都会得到它。

+0

我想我会尝试这种方法反对尝试儿童行动。我不喜欢模型工厂解决方案,因为我不认为每个模型都必须从基础模型类继承。 – Dismissile 2010-12-15 16:43:33

3

您可以使用子操作。 Phil Haack在这个blog post中做了很好的解释。通过这种方式,您将拥有一个特定的控制器,用于从存储库中获取数据并将其传递到其自己的部分视图。然后在您的主页面中,您只需包含以下操作:

<%= Html.Action("index", "somecontroller") %> 

这样其他控制器不需要将数据传递到视图。它有一个完全独立的生命周期。

+0

1漂亮且简单 – hunter 2010-12-15 15:57:53

+0

也许为了清楚:'<(%)= Html.Action( “的getMessages”, “MessagesController”)%>'和'<%= Html.Action( “GetAlerts”, “AlertsController”)% >' – hunter 2010-12-15 15:59:06

+1

儿童行为确实有缺点。他们迫使观察者太了解正在发生的事情。它们也很昂贵,因为系统必须模拟整个第二个请求。 Rails曾经有类似的功能,但最终被删除。 – 2010-12-15 15:59:37

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; 

    } 
} 

,那么你” d将IModelFactory注入控制器,然后在动作中使用它:

[HttpGet] 
public ViewResult DoSomething() 
{ 
    var model = this.modelFactory.Create<MyActionModel>(); 
    return View(model); 
} 

Th您的主人有MasterModel模型类型,然后可以使用此信息。这样,所有的逻辑都可以保存在注入工厂的服务/存储库中,从而创建每个视图的模型。这就是我所做的事情,它的成效非常好。