У меня есть встроенный стиль, в котором я хочу обратиться к частичному представлению на основе параметра, переданного к нему через ViewDataDictionary.
Мои ascx похожи на это -
<div <% if ((bool)ViewData["Visible"] == false) { %> style="display:none;" <% } %>>
...
</div>
Существует ли более чистый способ сделать это?
Править:
Просто для уточнения это - частичное представление, которое уже использует модель со строгим контролем типов. Так, мне был нужен способ передать дополнительную информацию частичному представлению, которое я не мог иметь в модели, потому что это на самом деле называли для каждой записи контейнера набора в модели для моего содержания представления.
Вы можете включить это в условный оператор:
<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;'" : "" %> />
Все представленные ответы будут работать, однако я предпочитаю заключать любую логику «если» в помощник Итак, это объединение всех ответов на данный момент .. (У меня нет 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 идеально подходит.
Вы можете создать пользовательскую модель для представления, где флаг находится в модели.
Так что вы могли бы сделать простой и простой
<% 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%. Но вы поняли идею.
Другая альтернатива, которую вы можете сделать, это создать модель и передать ее в ваш частичный класс. Например:
View model class:
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; } }
}
}
In your controller:
public ActionResult ShowPage()
{
var myViewModel = new myViewModel();
myViewModel.Visible = true;
return View(myViewModel);
}
In your View:
<%@Page .... Inherits="System.Web.Mvc.ViewPage<SampleNS.MyViewModel>"%>
...
<div <%= Model.DivInline %>>
...
</div>
Пожалуйста, обратите внимание, что это не проверено, но вы получите теорию :)
Надеюсь, это поможет!