Как получить несколько вариантов выбора из ASP.NET CheckBox - PullRequest
1 голос
/ 01 февраля 2011

Похоже, это должно быть просто, но я просто не могу заставить его работать!

У меня есть enum в моей модели, который я хочу отобразить в виде списка флажков.Пользователь может установить несколько флажков, и я хочу сохранить это в базе данных.

Таким образом, перечисление выглядит так (около 20 элементов без ограничений):

public enum ReferrerType
{
    [Description("No Data")]
    NoData = 9999,
    [Description("Father or Mother")]
    Parents = 1,
    [Description("Brother or Sister")]
    Sibling = 2,
    [Description("Other")]
    Other = 10
}

При этом описание является чем-тоотображается в пользовательском интерфейсе, а числовое значение - это то, что должно быть сохранено в базе данных.Числа должны оставаться в списке, так как они входят непосредственно в пакет статистики.

Затем я определил класс Referrer:

public class Referrer
{
    public virtual Guid Id { get; private set; }
    public virtual ReferrerType{ get; set; }
}

Я понимаю, что это может быть странным (анти) паттерном.,Я разработал его на скорую руку и раскаиваюсь на досуге.Любые советы по улучшению этой модели также будут высоко оценены!

Мой контроллер настраивает список:

private static IList<string> GenerateReferrerList()
{
    var values = from ReferrerType e in Enum.GetValues(typeof(ReferrerType))
                 select new { Name = e.ToDescription() };

    return values.Select(x => x.Name).ToList();
}

И я использую его в моем представлении так:

<div class="radio-boolean form-field" id="Referrers">
      <p class="form-field-attribute"> <span class="label">Referred By </span> </p>
      <% for (var i = 0; i < ((IList<string>)ViewData["ReferrerList"]).Count; i++)
      { %>
           <p class="form-field-value">
           <%= Html.CheckBox(string.Format("Referrers[{0}].Type", i) ) %>
           <label for="Referrers"> <%= ((IList<string>)ViewData["ReferrerList"])[i]%></label>
       </p>
</div>

И это не работает!Я предполагаю, что упускаю что-то очевидное, но я не могу понять, что.Там нет ошибок - просто пустая таблица базы данных, где должны быть ссылки ...

Как всегда, любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

Давайте на минутку посмотрим, что нам здесь нужно.Нам нужно показать форму, которая будет содержать несколько флажков (по одному для каждого значения перечисления) и связанную метку (эта метка должна исходить из атрибута Description, используемого в перечислении).Когда эта форма отправлена, мы хотим получить все значения, которые проверил использование.

Итак, как всегда, когда у нас есть четкое определение того, что мы пытаемся сделать, мы представляем нашу модель представления:

public class MyViewModel
{
    public bool IsChecked { get; set; }
    public ReferrerType ReferrerType { get; set; }
    public string Text { get; set; }
}

Затем мы пишем контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = Enum.GetValues(typeof(ReferrerType)).Cast<ReferrerType>().Select(x => new MyViewModel
        {
            ReferrerType = x,
            Text = x.ToDescription() // I guess that's an extension method you wrote
        });
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        ...
    }
}

И, наконец, строго типизированное представление, соответствующее действию Index нашего контроллера (~ / Views / Home / Index.aspx):

<% using (Html.BeginForm()) { %>
    @Html.EditorForModel()
    <input type="submit" value="OK" />
<% } %>

и последняя часть представляет собой соответствующий шаблон редактора (~/Views/Home/EditorTemplates/MyViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.MyViewModel>" %>
<%= Html.CheckBoxFor(x => x.IsChecked) %>
<%= Html.HiddenFor(x => x.ReferrerType) %>
<label><%: Model.Text %></label>

Теперь, когда эта форма отправляется внутри действия индекса POST, вы получите список всех перечислений ссоответствующее логическое значение, указывающее, проверил ли пользователь это или нет.

1 голос
/ 01 февраля 2011

ОТ: Не выполнять лишних действий:

return (from e in Enum.GetValues(typeof(ReferrerType))
        select e.ToDescription()).ToList();

или просто

return Enum.GetValues(typeof(ReferrerType)).Select(e => e.ToDescription()).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...