Как сделать так, чтобы данные никогда не менялись в раскрывающемся списке? - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть много просмотров, которые будут содержать выпадающий список выбора, чтобы показать статус.Три разных и неизменных значения статуса «Релиз», «Обзор» и «Новый».Я продолжаю слышать, что мой контроллер должен предоставлять все данные для моего просмотра, но применимо ли это даже к статическим данным, подобным этому.

Кто-нибудь может подсказать, как мне лучше всего кодировать это поле выбора?

Обратите внимание, что это для C # ASP.NET MVC3

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Если он полностью статичен, вы можете просто создать для него помощник в папке App_Code :

@helper StatusList()
{
  <select id="status-list">
     <option></option>
     <option value="Release">Release</option>
     <option value="Review">Review</option>
     <option value="New">New</option>
   </select>
}

и назовите его с разных точек зрения:

@StatusList()

OR

использовать частичное представление в Views \ Shared:

<select id="status-list">
    <option></option>
    <option value="Release">Release</option>
    <option value="Review">Review</option>
    <option value="New">New</option>
</select>

и визуализировать частичное из каждого представления:

@Html.Partial("_StatusList")

OR

чтобы сделать это из C #, и контроллер создаст общий вспомогательный класс:

public static class Helpers
{
    public static IEnumerable<SelectListItem> GetStatusList()
    {
        var items = new[] { "Release", "Review", "New" };
        return items.Select(x => new SelectListItem
        {
            Value = x,
            Text = x
        });
    }
}

добавить эти свойства для каждой ViewModel:

public IEnumerable<SelectListItem> StatusList { get; set; } 
public string StatusListSelectedValue { get; set; } 

и это на каждом View:

@Html.DropDownListFor(x => x.StatusListSelectedValue, Model.StatusList, "")
1 голос
/ 29 декабря 2011

Мое предложение немного отличается от приведенного выше.

Где-то у вас должна быть базовая модель или базовый контроллер (модель лучше подходит для моего решения).

В этом классе используйте метод, подобный этому

        public static SelectList MakeSelectListStatus(IEnumerable Coll, bool emptyElem = true)
        {
            List<SelectListItem> Items = new List<SelectListItem>();
            if (emptyElem)
                Items.Add((new SelectListItem { Text = " ", Value = "-1" }));
            foreach (var Elem in Coll)
            {
                SelectListItem AddMe = new SelectListItem();
                AddMe.Text = Elem.Descr;
                AddMe.Value = Elem.ID.ToString();
                Items.Add(AddMe);
            }
            SelectList Res = new SelectList(Items, "Value", "Text");
            return Res;
        }

Тогда в ваших взглядах просто используйте:

@Html.DropDownListFor(m => m.id, BaseModel.MakeSelectListStatus(Model.Statuses, false), new { id = "Statuses" })

Два больших преимущества в этом методе: 1. у вас нигде нет волшебных строк HTML 2. если ваши коллекции спроектированы правильно, у вас может быть один метод для создания экземпляров каждого списка выбора

Основным недостатком является наличие базовой модели, но ее можно легко решить с помощью статического класса где-то.

Однако, если вам кажется, что иметь помощника лучше для вас, я предлагаю вам иметь помощника, возвращающего объект SelectList, а не HTML-разметки, точно не знаю почему, но я считаю его более универсальным.

НТН

0 голосов
/ 29 декабря 2011

Перечисления - хороший способ, когда категории никогда не меняются. У меня есть полный пример на Использование DropDownList и ListBox с ASP.NET MVC

        public enum eMovieCategories { Action, Drama, Comedy, Science_Fiction };

    private void SetViewBagMovieType(eMovieCategories selectedMovie) {

        IEnumerable<eMovieCategories> values =
                          Enum.GetValues(typeof(eMovieCategories))
                          .Cast<eMovieCategories>();

        IEnumerable<SelectListItem> items =
            from value in values
            select new SelectListItem
            {
                Text = value.ToString(),
                Value = value.ToString(),
                Selected = value == selectedMovie,
            };

        ViewBag.MovieType = items;
    }

    public ActionResult SelectCategoryEnum() {
        SetViewBagMovieType(eMovieCategories.Drama);
        return View("SelectCategory");
    }

View

@{
ViewBag.Title = "Category Select";
Layout = "~/Views/Shared/_Simple_Layout.cshtml";

}

@ using (Html.BeginForm ("CategoryChosen", "Home", FormMethod.Get)) { Тип фильма @ Html.DropDownList ( "MovieType")

Отправьте мне письмо, и я запишу вам учебник. Рик Андерсон на microsoft.com

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