我有一个内联样式我想根据通过ViewDataDictionary传入的参数应用于局部视图。
我的ascx看起来像这样 -
<div <% if ((bool)ViewData["Visible"] == false) { %> style="display:none;" <% } %>>
...
</div>
有更简洁的方法吗?
修改
只是为了澄清,这是一个已经使用强类型模型的局部视图。因此,我需要一种将额外信息传递给部分视图的方法,这是我在模型中无法实现的,因为实际上是为包含视图的模型中的集合容器的每个条目调用它。
答案 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>
请注意,这未经过测试,但您可以获得理论:)
希望这有帮助!