MVC布局模型设计模式

时间:2011-04-06 14:56:09

标签: asp.net-mvc design-patterns asp.net-mvc-3 razor

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

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

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

我真的不希望必须从布局模型中获取我的模型子类,因为这会强制每个操作单独填写共享模型数据,但手动创建HtmlHelpers似乎也是一个坏主意。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

我可能错了,但你不应该使用部分观点吗? 你的解决方案看起来太复杂了。

答案 1 :(得分:2)

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

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; }
}

然后,在每个请求中,您将使用用户特定信息和视图所需的任何信息填充您的viewmodel。 MyViewModel只是一个继承自BaseViewModel的视图模型。

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

        return View(viewModel);
    }
}

在主视图中,我将传入BaseViewModel,而View I将传入继承的MyViewModel。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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