Html помощник для логических значений в asp.net mvc - PullRequest
1 голос
/ 27 января 2010

Существуют ли какие-либо вспомогательные html-методы для отображения логических значений в раскрывающемся списке?

Ответы [ 5 ]

13 голосов
/ 07 ноября 2011

Это старая тема, но она все еще находится в начале некоторых поисков.

Вы можете сделать это, используя встроенный DropDownListFor HTML Helper:

 <%= Html.DropDownListFor(model => Model.MyBooleanProperty,new List<SelectListItem>(){ new SelectListItem(){ Text = "Yes", Value="True"}, new SelectListItem(){ Text = "No", Value="False"}})%>

Вы также можете реализовать свой собственный HTML Helper:

    public static MvcHtmlString BooleanDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return BooleanDropdownListFor(htmlHelper, expression, null);

    }
    public static MvcHtmlString BooleanDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string EmptyText)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        bool? value = null;

        if (metadata != null && metadata.Model != null)
        {
            if (metadata.Model is bool)
                value = (bool)metadata.Model;
            else if (metadata.Model.GetType() == typeof(bool?))
                value = (bool?)metadata.Model;
        }

        List<SelectListItem> items = EmptyText != null ?
            new List<SelectListItem>() { new SelectListItem() { Text = EmptyText, Value = "" }, new SelectListItem() { Text = "Yes", Value = "True", Selected = (value.HasValue && value.Value == true) }, new SelectListItem() { Text = "No", Value = "False", Selected = (value.HasValue && value.Value == false) } } :
            new List<SelectListItem>() {new SelectListItem() { Text = "Yes", Value = "True", Selected = (value.HasValue && value.Value == true) }, new SelectListItem() { Text = "No", Value = "False", Selected = (value.HasValue && value.Value == false) } };

        return htmlHelper.DropDownListFor(expression, items);
    }

Я предлагаю использовать свойство Nullable Bool в вашей View Model, чтобы раскрывающийся список не по умолчанию имел значение «false» или «true». Вы можете легко разметить модель представления с помощью атрибута Required, который будет обрабатываться, если не выбрана ни одна опция.

2 голосов
/ 27 января 2010

Используйте помощник DropDownListFor. Передайте логическое значение и список выбора, содержащий значения, которые вы хотите отобразить обратно на логическое значение.

Model.MyBooleanList может быть списком выбора с selectlistitems {(«Да», true); («Нет», false)} Model.MyBoolean - это просто значение bool, которое вы хотите получить / установить в своем представлении

<%= Html.DropDownListFor(m => m.MyBoolean, Model.MyBooleanList)%>

НТН

2 голосов
/ 27 января 2010

Почему бы не использовать Html.CheckBox ()?

0 голосов
/ 05 ноября 2013

если вы хотите зафиксировать значения YES, NO и NOTSET (нет ответа), я бы предложил вам использовать раскрывающийся список, подобный этому

Public Class MyModelClass
{
  [Display(Name = "Project Based Subsidy?")]
  public Nullable<bool> IsSubsidyProjectBased{ get; set; }

  public SelectList DropDownItems
  {
      get
      {
          List<DropDownItems> ddItem = new List<DropDownItems>();
          ddItem.Add(new DropDownItems("--Select--", null));
          ddItem.Add(new DropDownItems("Yes", true));
          ddItem.Add(new DropDownItems("No", false));                
          return new SelectList(ddItem, "Value", "Text");
      }
  }

public class DropDownItems
{
    public DropDownItems(string text, bool? value)
    {
        this.Text = text;
        this.Value = value;
    }
    public string Text { get; set; }
    public bool? Value { get; set; } 
}

}

Тогда в вашем представлении вы можете просто иметь

@Html.DropDownListFor(model => model.IsSubsidyProjectBased, Model.DropDownItems)
0 голосов
/ 03 мая 2013

У меня есть это:

public static class BoolUtility
{
    public static IEnumerable<SelectListItem> SelectList(string defaultText = null, string defaultTrue = "True", string defaultFalse = "False")
    {
        var list = new List<SelectListItem>
        {
            new SelectListItem {Text = defaultTrue, Value = "True"},
            new SelectListItem {Text = defaultFalse, Value = "False"}
        };

        if (defaultText != null)
        {
            list.Insert(0, new SelectListItem
            {
                Text = defaultText,
                Value = string.Empty
            });
        }

        return list;
    }
}

И используйте это так:

@Html.DropDownListFor(m => m.SomeBoolProperty, BoolUtility.SelectList("All", "Yes", "No"))

И, похоже, работает хорошо. Довольно гибкий, так как вы можете контролировать все метки, и есть ли значение «по умолчанию».

Да, и несколько юнит-тестов NUnit, если хотите. Ни в коем случае не всеобъемлющий, но это не так сложно ...

[TestFixture]
class BoolUtilityTests
{
    [Test]
    public void Parameterless()
    {
        var actual = BoolUtility.SelectList().ToList();
        Assert.That(actual.Count, Is.EqualTo(2));
        Assert.That(actual.First().Text, Is.EqualTo("True"));
        Assert.That(actual.First().Value, Is.EqualTo("True"));
        Assert.That(actual.Last().Text, Is.EqualTo("False"));
        Assert.That(actual.Last().Value, Is.EqualTo("False"));
    }

    [Test]
    public void LabelOverrides()
    {
        var actual = BoolUtility.SelectList(defaultTrue: "Yes", defaultFalse: "No").ToList();
        Assert.That(actual.Count, Is.EqualTo(2));
        Assert.That(actual.First().Text, Is.EqualTo("Yes"));
        Assert.That(actual.First().Value, Is.EqualTo("True"));
        Assert.That(actual.Last().Text, Is.EqualTo("No"));
        Assert.That(actual.Last().Value, Is.EqualTo("False"));
    }

    [Test]
    public void IncludeDefaultOption()
    {
        var actual = BoolUtility.SelectList(defaultText: "all").ToList();
        Assert.That(actual.Count, Is.EqualTo(3));
        Assert.That(actual.First().Text, Is.EqualTo("all"));
        Assert.That(actual.First().Value, Is.EqualTo(string.Empty));
    }
}
...