Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC布局模型设计模式_Asp.net Mvc_Design Patterns_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc MVC布局模型设计模式

Asp.net mvc MVC布局模型设计模式,asp.net-mvc,design-patterns,asp.net-mvc-3,razor,Asp.net Mvc,Design Patterns,Asp.net Mvc 3,Razor,我的站点中的每个页面都应该有一些相同的数据,类似于中的数据,因此每个页面都会在页面顶部显示当前用户的信息。我实现这一点的方式是拥有一个基本控制器类,我的所有控制器都是从该类派生的。在基本控制器的构造函数中,我将模型放在ViewBag中,然后我的布局页面使用它 我遇到了这个问题,因为我的布局不是强类型的。例如,我必须在布局页面中构建新的HTMLHelper: @{var layoutHtml = new HtmlHelper<LayoutModel>(Html.ViewContext,

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

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

@{var layoutHtml = new HtmlHelper<LayoutModel>(Html.ViewContext, Html.ViewDataContainer); }
@* OK, now we can use the html helper... *@
@layoutHtml.TextAreaFor(model => model.Feedback)
@{var layoutHtml=newhtmlHelper(Html.ViewContext,Html.ViewDataContainer);}
@*好的,现在我们可以使用html助手*@
@layoutHtml.TextAreaFor(model=>model.Feedback)
我真的不想让我的模型子类来自一个布局模型,因为这将迫使每个操作单独填写共享模型数据,但是手动创建HtmlHelpers似乎也是一个坏主意


有什么想法吗?

我可能是错的,但是你不应该用局部视图吗?

您的解决方案看起来太复杂了。

我可能错了,但您不应该为此使用局部视图吗?

您的解决方案看起来太复杂了。

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

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

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

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

基本控制器是一种很好的启动方式。我还将介绍一个基本的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; }
}
公共抽象类BaseController:控制器
{
公共字符串CurrentAccountName
{
得到
{
返回(HttpContext.User==null)?null:HttpContext.User.Identity.Name;
}
}
public T CreateViewModel(),其中T:BaseViewModel,new()
{
T视图模型=新的T
{
UserName=CurrentAccountName
};
返回视图模型;
}
}
公共抽象类BaseViewModel
{        
公共字符串用户名{get;set;}
}
然后,在每个请求中,您将使用特定于用户的信息以及视图所需的任何信息填充viewmodel。MyViewModel只是从BaseViewModel继承的viewmodel

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

        return View(viewModel);
    }
}
公共类MyController:BaseController
{
公共行动结果索引()
{
MyViewModel viewModel=CreateViewModel();
返回视图(viewModel);
}
}
在主视图中,我将传入BaseViewModel,在继承的MyViewModel中传入视图

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

        return View(viewModel);
    }
}

现在,您可以在主视图中访问用户信息,并可以将其传递到局部视图或直接渲染到页面。

基本控制器是一个很好的开始方式。我还将介绍一个基本的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; }
}
公共抽象类BaseController:控制器
{
公共字符串CurrentAccountName
{
得到
{
返回(HttpContext.User==null)?null:HttpContext.User.Identity.Name;
}
}
public T CreateViewModel(),其中T:BaseViewModel,new()
{
T视图模型=新的T
{
UserName=CurrentAccountName
};
返回视图模型;
}
}
公共抽象类BaseViewModel
{        
公共字符串用户名{get;set;}
}
然后,在每个请求中,您将使用特定于用户的信息以及视图所需的任何信息填充viewmodel。MyViewModel只是从BaseViewModel继承的viewmodel

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

        return View(viewModel);
    }
}
公共类MyController:BaseController
{
公共行动结果索引()
{
MyViewModel viewModel=CreateViewModel();
返回视图(viewModel);
}
}
在主视图中,我将传入BaseViewModel,在继承的MyViewModel中传入视图

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

        return View(viewModel);
    }
}

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

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

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