Простой DropDownListFor в MVC2? - PullRequest
       3

Простой DropDownListFor в MVC2?

2 голосов
/ 20 июля 2010

У меня есть таблица, в которой значение True / False хранится в виде битового поля sqlserver (Featured).Во-первых, есть ли лучший способ создать выпадающий список для этого, кроме как вручную?

Во-вторых, вот то, что у меня есть, которое работает, но не добавляет selected="selected" ни к каким элементам в DDL.

Редактировать 1: Я обновил этот пример в соответствии с предложенным ответом, и он приводит к ошибке во время выполнения :( Редактировать 2: Использование его какфункция работает (с и без приведения), но selected = «selected» по-прежнему не добавляется.

Модель:

//
// View models
public class SpotlightFormViewModel
{

    // props
    public Spotlight Spotlight { get; private set; }
    public SelectList FeaturedMenu { get; private set; }

    static IDictionary<string, int> feature = new Dictionary<string, int>(){
        {"True", 1},
        {"False", 0},
    };

    public IEnumerable<SelectListItem> FeaturedChoices(Spotlight spotlight)
    {
        return feature.Select(f => new SelectListItem
        {
            Text = f.Key,
            Value = f.Value.ToString(),
            Selected = spotlight.Featured,
        });
    }

    // constr
    public SpotlightFormViewModel(Spotlight spotlight)
    {
        Spotlight = spotlight;
        FeaturedMenu = new SelectList(FeaturedChoices(spotlight));
    }
}

Контроллер:

    public ActionResult Edit(int id)
    {
        Spotlight spotlight = spotlightRepository.GetSpotlight(id);

        return View(new SpotlightFormViewModel(spotlight));
    }

Просмотр:

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Spotlight.Featured) %>
        </div>
        <div class="editor-field">
            <%: Html.DropDownListFor(model => model.FeaturedMenu, Model.FeaturedChoices(Model.Spotlight))%>
            <%: Html.ValidationMessageFor(model => model.Spotlight.Featured) %>
        </div>

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Я использую dropdowlist в том же, что и вы. Но в вашем случае вы могли бы просто использовать несколько переключателей:

 <%: Html.Label("True") %>
 <%: Html.RadioButtonFor(model => model.FeaturedMenu, "1") %>

 <%: Html.Label("False") %>
 <%: Html.RadioButtonFor(model => model.FeaturedMenu, "0") %>

Во-вторых, вы говорили о «выбранном» значении, но вы не использовали его в «общедоступном IEnumerable FeaturedChoices», вы можете добавить выбранное значение следующим образом:

return feature.Select(f => new SelectListItem
{
    Text = f.Key,
    Value = f.Value.ToString(),
    Selected = false
});
1 голос
/ 22 июля 2010

Я, наконец, получил это работает. Несмотря на то, что мой синтаксис и логика были правильными, когда я передавал переменные в public IEnumerable FeaturedChoices(Spotlight spotlight), это не сработало бы, даже если я явно пометил Selected = true. Если кто-то может ответить, почему это так, я был бы признателен

Единственный способ selected="selected" был применен правильно, если я сделал FeaturedChoices свойством с геттером. Полный рабочий код ниже

Посмотреть модель:

//
// View models
public class SpotlightFormViewModel
{

    // props
    public Spotlight Spotlight { get; private set; }
    public SelectList FeaturedMenu { get; private set; }

    static IDictionary<string, int> feature = new Dictionary<string, int>(){
        {"True", 1},
        {"False", 0},
    };

    public IEnumerable<SelectListItem> FeaturedChoices
    {
        get
        {                
            return feature.Select(f => new SelectListItem
            {
                Text = f.Key,
                Value = f.Value.ToString(),
                Selected = IsSelected(this.Spotlight.Featured, f.Key)
            });
        }
    }

    private bool IsSelected(bool featured, string val)
    {
        bool result = false;

        if (String.Compare(val, "True") == 0 && featured)
            result = true;
        else if (String.Compare(val, "False") == 0 && !featured)
            result = true;

        return result;
    }

    // constr
    public SpotlightFormViewModel(Spotlight spotlight)
    {
        Spotlight = spotlight;
    }
}

Контроллер:

    public ActionResult Edit(int id)
    {
        Spotlight spotlight = spotlightRepository.GetSpotlight(id);

        return View(new SpotlightFormViewModel(spotlight));
    }

Вид:

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Spotlight.Featured) %>
        </div>
        <div class="editor-field">
            <%: Html.DropDownListFor(model => model.FeaturedMenu, Model.FeaturedChoices)%>
            <%: Html.ValidationMessageFor(model => model.Spotlight.Featured) %>
        </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...