在asp.net mvc2中有条件地渲染视图的一部分的清洁方式

时间:2010-07-19 10:24:24

标签: asp.net-mvc-2

我有一个内联样式我想根据通过ViewDataDictionary传入的参数应用于局部视图。

我的ascx看起来像这样 -

<div <% if ((bool)ViewData["Visible"] == false) { %> style="display:none;" <% } %>>
  ...
</div>

有更简洁的方法吗?

修改
只是为了澄清,这是一个已经使用强类型模型的局部视图。因此,我需要一种将额外信息传递给部分视图的方法,这是我在模型中无法实现的,因为实际上是为包含视图的模型中的集合容器的每个条目调用它。

4 个答案:

答案 0 :(得分:1)

您可以在条件运算符中包含它:

<div <%= !(bool)ViewData["Visible"] ? "style='display:none;'" : "" %>>
  ...
</div>

我没有开放测试的MVC项目,但是在标准ASP.Net中进行了以下工作。将显示以下内容:

<div id="foo" <%= "a" == "b" ? 
    "style='display:none;'" : "" %> />

这将正确设置样式:

<div id="foo" <%= "a" == "a" ? 
    "style='display:none;'" : "" %> />

答案 1 :(得分:1)

所有提出的答案都可行,但我更喜欢在帮助器中包含任何“if”逻辑 所以到目前为止这是对所有答案的合并..(我面前没有VS,但这就是我要做的)

public static string DisplayDivStyle(this Htmlhelper helper, bool visible)
{
  return visible ? String.Empty: "style=\"display:none\"" ; 
}

然后像这样使用..

<div <%= Html.DisplayDivStyle((bool)ViewData["Visible"])%>>

一般来说,如果可见性是一个恒定的显示要求,那么在视图模型中连接它(如uriDium建议的那样),否则对于特殊情况,我认为ViewData是完美的。

答案 2 :(得分:0)

您可以为标志在模型中的视图创建自定义模型。

所以你可以做一个简单明了的

<% if (Model.Visible) { %>
<div id='foo'></div>
<% } %>

包装原始模型的自定义类:

public class MyCustomModel 
{
  private Original model {get; set;}
  private bool visible {get; set;}

  public class MyCustomModel(Original model)
  {
    this.model = model;
  }
}

然后在控制器中创建包装器并将其传递给您的视图。 然后在视图的顶部将模型类型更改为自定义类型。像

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MVCApp.ViewModels.YourCustomModel>" %>

请原谅我的语法,它可能不是100%。你明白了。

答案 3 :(得分:0)

您可以做的另一个选择是创建模型并将其传递给您的分部类。例如:

查看模型类:

using System;
using System.Web;
...
namespace Sample {
public class MyViewModel
    {
       public bool Visible { get; set; }
       public string DivInline { get { return !Visible ? "style=\"display:none\"" : String.Empty; } }
    }
}

在您的控制器中:

public ActionResult ShowPage()
{
     var myViewModel = new myViewModel();
     myViewModel.Visible = true;
     return View(myViewModel);
}

在您的视图中:

<%@Page .... Inherits="System.Web.Mvc.ViewPage<SampleNS.MyViewModel>"%>
...
<div <%= Model.DivInline %>>
...
</div>

请注意,这未经过测试,但您可以获得理论:)

希望这有帮助!