我希望能够根据数据库中的设置更改_Layout.cshtml视图 我知道它可能是在_ViewStart.cshml视图中完成的。
我正在使用EF 4.2,并希望采用不会破坏任何设计模式的解决方案。
不确定如何在MVC中执行此操作。
在网络表单中,我可以在母版页的代码隐藏中轻松完成此操作。
我在我的基本控制器中做了类似的事情:
public abstract class BaseController : Controller
{
private IUserRepository _userRepository;
protected BaseController()
: this(
new UserRepository())
{
}
public BaseController(IUserRepository userRepository)
{
_userRepository = userRepository;
}
我也看过FunnelWeb来源,但我不太了解它们是如何注入的......
答案 0 :(得分:3)
旧问题,但对于遇到此问题的任何人来说,使用动作过滤器属性
是一个很好的解决方案public class LoadUserLayoutAttribute : ActionFilterAttribute
{
private readonly string _layoutName;
public LoadUserLayoutAttribute()
{
_layoutName = MethodToGetLayoutNameFromDB();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
result.MasterName = _layoutName;
}
}
}
然后,您可以使用此自定义属性向基本控制器(或操作)添加属性:
[LoadUserLayout]
public abstract class BaseController : Controller
{
...
}
答案 1 :(得分:2)
将此代码添加到BundleConfig类的RegisterBundles方法中。请注意,我正在为每个css创建一个单独的包,这样我就不会将每个css呈现给客户端。我可以在共享_Layout.cshtml视图的HEAD部分中选择要呈现的包。
bundles.Add(new StyleBundle("~/Content/Ceruleancss").Include(
"~/Content/bootstrapCerulean.min.css",
"~/Content/site.css"));
bundles.Add(new StyleBundle("~/Content/defaultcss").Include(
"~/Content/bootstrap.min.css",
"~/Content/site.css"));
然后在shared_Layout.cshtml中放入一些逻辑来呈现相应的包。由于此布局视图会为每个页面触发,因此这是一个放置它的好地方。
如果您为自己的应用支持多个军团,我认为这种方法可以用于品牌推广。它也可以用来提供用户提供的自定义样式。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - Contoso University</title>
@{
if (HttpContext.Current.User.Identity.Name == "MARK")
{
@Styles.Render("~/Content/defaultcss");
}
else
{
@Styles.Render("~/Content/Ceruleancss");
}
}