Более чистый способ условного рендеринга части представления в asp.net mvc2

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

Мои ascx похожи на это -

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

Существует ли более чистый способ сделать это?

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

1
задан Antony Scott 19 July 2010 в 13:46
поделиться

4 ответа

Вы можете включить это в условный оператор:

<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
ответ дан 2 September 2019 в 22:56
поделиться

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

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

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

<% 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
ответ дан 2 September 2019 в 22:56
поделиться

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

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>

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

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

0
ответ дан 2 September 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: