2010-07-19 40 views
1

我有一种内联样式,我想根据通过ViewDataDictionary传递给它的参数应用于部分视图。在asp.net中有条件地呈现部分视图的更清晰的方式mvc2

我的ascx这个样子的 -

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

有一个更清洁的方式做到这一点?

编辑:
只是为了澄清,这是一个已经使用强类型模型的局部视图。所以,我需要一种将额外信息传递给部分视图的方法,这在模型中是不可能的,因为它实际上是针对包含视图的模型中的每个集合容器条目调用的。

+0

如果它的一个部分需要逻辑,坚持你所拥有的 – Ahmad 2010-07-19 11:22:31

回答

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;'" : "" %> /> 
+0

这里还有一些更多的三元运算符的例子http://stackoverflow.com/questions/1168841/c-asp-net-mvc-single-line- if-clause-in-view – 2010-07-19 11:07:43

+0

很好,很好用。但是我对它有一点反思,因为我可能不会重新使用我已经摆脱了代码的局部视图。我认为,如果我要这样做,我会为派生视图提供“隐藏”选项,并在基本视图的代码隐藏中加入一个标志。 – 2010-07-19 13:42:59

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%。不过你明白了。

+0

它不是我想要有条件显示的div,而是内联样式。我的部分已经强烈地键入了一些我不能把标志放入的东西。 – 2010-07-19 10:54:12

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> 

请大家注意,这不是测试,而是你得到的理论:)

希望这有助于!

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是完美的。