【问题标题】:Render dynamic class value in MVC layout在 MVC 布局中渲染动态类值
【发布时间】:2015-12-27 18:10:21
【问题描述】:

我的 MVC 布局页面大致如下所示

<!DOCTYPE HTML
<html class="prod">
    <head>
    </head>
    <body>
    </body>
</html>

我想根据控制器返回的内容动态呈现类属性 (prod) 的值。

到目前为止,我尝试了以下变体但没有成功

控制器

[ChildActionOnly]
[AllowAnonymous]
public PartialViewResult Environment()
{
    return PartialView("Environment", "prod");
}

查看

@model string 
@Model

布局

<html class="@{ Html.RenderAction("Environment", "Site"); }">

这实际上会生成以下内容

<htmlprod class=""></htmlprod>
<html>
</html>

当我使用 ContentResult 时也会发生同样的事情。需要明确的是,我不想使用 Viewbag。

我想生成一个原始 HTML 字符串并使用 PartialView 或类似的东西来显示它。实际值是通过控制器(ioc)的构造函数中的参数获取的。

【问题讨论】:

  • 出于好奇,Viewbag 有什么问题?为什么控制器必须知道在哪个环境中?这似乎不合逻辑。

标签: asp.net-mvc asp.net-mvc-4 razor dynamic asp.net-mvc-partialview


【解决方案1】:

您不需要部分返回类名。您可以将类名设置为动态 ViewBag 字典并在您的布局中使用它。

public ActionResult Index()
{
  ViewBag.HtmlClass="prod";
  return View();
}

在你的布局中

<html class="@ViewBag.HtmlClass">

</html>

如果您不想使用 ViewBag,您可以创建一个子操作方法,它只返回一个字符串。

[ChildActionOnly]
public string Environment()
{
    return "production";
}

在你的布局中,

<html class="@Html.Action("Environment","Home")">
</html>

【讨论】:

  • 感谢您的回复,但我不想使用 ViewBag。我在问题中特别提到了这一点。
  • 另外,由于这是一个布局页面,我必须将它添加到每个控制器上的每个操作中,使其不可行。
  • 调用一个动作似乎是一种非常昂贵的方法(创建一个控制器并不是微不足道的)。
【解决方案2】:

你这个模糊的问题似乎有一些不足之处。控制器不应该负责应用程序在什么环境中执行。我可能会这样做:

全球.asax:

public class MvcApplication : System.Web.HttpApplication
{
  private const string Environment = "Environment";

  protected void Application_Start()
  {
    this.Application.SetEnvironment(Configuration.AppSettings[Environment]);
  }
}

HttpApplicationStateExtensions.cs

internal static HttpApplicationStateExtensions
{
  private const string Environment = "Environment";

  public static void SetEnvironment(this HttpApplicationState state,
    string environment)
  {
    state.Application[Environment] = environment;
  }
  public static string GetEnvironment(this HttpApplicationState state)
  {
    var result = state.Application[Environment];
    return result;
  }
}

WebViewPageExtensions.cs

internal static WebViewPageExtensions
{
  private const string Environment = "Environment";

  public static string GetEnvironment(this WebViewPage page)
  {
    var result = page.AppState[Environment];
    return result;
  }
}

用法:

<html class="@GetEnvironemnt()">
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多