2011-04-06 109 views
1

我网站中的每个页面都应该有一些相同的数据,类似于SO中的每个页面都显示有关页面顶部当前用户的信息。我实现这个的方式是让我的控制器派生出一个基础控制器类。在该基础控制器的构造函数中,我将模型放入ViewBag中,然后我的布局页面使用它。MVC布局模型设计模式

我遇到了问题,因为我的布局没有强类型。例如,我在页面布局,构建新的HtmlHelpers:

@{var layoutHtml = new HtmlHelper<LayoutModel>(Html.ViewContext, Html.ViewDataContainer); } 
@* OK, now we can use the html helper... *@ 
@layoutHtml.TextAreaFor(model => model.Feedback) 

我真的不希望有有从布局模型我的模型子类,因为这将迫使每个动作填写共享模型数据单独,但手动创建HtmlHelpers也似乎是一个坏主意。

有什么想法?

回答

3

我可能是错的,但不应该使用部分视图这个?
您的解决方案看起来太复杂。

0

您可以定义多个布局,您可以在适当的视图中使用!只需包含它们如下:

@{ 
    Layout = "~/Views/Shared/_MySubLayout.cshtml"; 
} 
2

基本控制器是一种很好的启动方式。我也会介绍一个基本的viewmodel。基本视图模型将包含用户特定的信息。

public abstract class BaseController : Controller 
{ 
    public string CurrentAccountName 
    { 
     get 
     { 
      return (HttpContext.User == null) ? null : HttpContext.User.Identity.Name; 
     } 
    } 

    public T CreateViewModel<T>() where T : BaseViewModel, new() 
    { 
     T viewModel = new T 
     { 
      UserName = CurrentAccountName 
     }; 

     return viewModel; 
    } 
} 

public abstract class BaseViewModel 
{   
    public string UserName { get; set; } 
} 

然后对每个请求,你会填充用户特定信息以及任何需要的视图的信息您的视图模型。 MyViewModel只是一个从BaseViewModel继承的视图模型。

public class MyController : BaseController 
{ 
    public ActionResult Index() 
    { 
     MyViewModel viewModel = CreateViewModel<MyViewModel>(); 

     return View(viewModel); 
    } 
} 

在主视图中,我将通过BaseViewModel和视图传递给继承的MyViewModel。

现在,您可以在主视图中访问您的用户信息,并且可以将其传递给部分或直接呈现给页面。

0

我相信你可以使用RenderAction来解决这个问题。由于此操作将显示的信息在所有页面上都很常见,因此您可以将其放入BaseController并从站点主服务器调用它。它将计算自己的模型并将该模型返回到可以强类型化的局部视图,并且您不必像现在这样执行htmlHelper实例化。