我希望能够根据数据库中的设置更改_Layout.cshtml视图。
据我所知,这可能是在_ViewStart.cshml视图中完成的。
我正在使用EF 4.2,并希望采用一种不会破坏任何设计模式的解决方案。
不确定如何在MVC.中进行此操作。
在web表单中,我可以很容易地在主页的代码背后完成这个任务。
在我的基本控制器里,我正在做这样的事情:
public abstract class BaseController : Controller
{
private IUserRepository _userRepository;
protected BaseController()
: this(
new UserRepository())
{
}
public BaseController(IUserRepository userRepository)
{
_userRepository = userRepository;
}我也看过FunnelWeb源代码,但我不太了解它们是如何注入的。
发布于 2012-08-22 13:53:01
老问题,但是对于任何遇到这个问题的人,这里有一个很好的解决方案,使用Action属性
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
{
...
}发布于 2015-05-08 15:27:37
将此代码添加到BundleConfig类的BundleConfig方法中。请注意,我正在为每个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");
}
}https://stackoverflow.com/questions/9305064
复制相似问题