Более чистый способ условного рендеринга части представления в asp.net mvc2 - PullRequest
1 голос
/ 19 июля 2010

У меня есть встроенный стиль, который я хочу применить к частичному представлению на основе параметра, переданного ему через ViewDataDictionary.

Мой ascx выглядит следующим образом -

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

Isесть более чистый способ сделать это?

Редактировать: Просто чтобы уточнить, это частичное представление, которое уже использует строго типизированную модель.Итак, мне нужен был способ передачи дополнительной информации в частичное представление, которого у меня не было в модели, потому что он фактически вызывался для каждой записи контейнера коллекции в модели для моего содержащего представления.

Ответы [ 4 ]

1 голос
/ 19 июля 2010

Все представленные ответы будут работать, однако я предпочитаю обернуть любую «если» логику в помощник Так что это объединение всех ответов до сих пор .. (У меня нет 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 идеален.

1 голос
/ 19 июля 2010

Вы можете содержать его в условном операторе:

<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 голосов
/ 19 июля 2010

Другая альтернатива, которую вы можете сделать, - создать модель и передать ее вашему частичному классу. Например:

Просмотр модели класса:

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>

Обратите внимание, что это не проверено, но вы получите теорию:)

Надеюсь, это поможет!

0 голосов
/ 19 июля 2010

Вы можете создать собственную модель для вида, где флаг находится в модели.

чтобы вы могли сделать простой и простой

<% 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%. Вы поняли, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...