2014-09-16 6 views
1

Я ищу философию звука для приведения динамических данных в представление, чтобы заполнить выпадающий список. Было бы неплохо создать модельный объект для dropdownlists и других «служебных» данных или использовать viewbag?MVC: Лучший способ заполнить Html .DropDownList

Благодаря

+0

http://forums.asp.net/post/5548697.aspx Это лучший способ по моему мнению. –

ответ

4

Использование ViewBag (а некоторые из них предложили в других ответов/комментариев), чтобы получить данные от контроллера для просмотра, как правило, рассматривается в качестве кода недостатка.

Ваша модель ViewModel должна идеально содержать все данные, необходимые для просмотра. Поэтому используйте свой контроллер для заполнения этих данных в свойстве ViewModel:

Вот простой пример создания выпадающего списка в ASP.NET MVC с использованием Html.DropDownListДля использования модели. Вы можете сделать это, как это все встраиваются в вашем * .cshtml файл следующим образом:

@Html.DropDownListFor(model => model.Package.State, new SelectList(
        new List<Object>{ 
         new { value = 0 , text = "Red" }, 
         new { value = 1 , text = "Blue" }, 
         new { value = 2 , text = "Green"} 
        }, 
        "value", 
        "text", 
        2)) 

, который будет создавать так:

<select id="Package_State" name="Package.State"><option value="0">Red</option> 
<option value="1">Blue</option> 
<option value="2">Green</option> 
</select> 

Обратитесь к this answer для получения дополнительной информации

+0

Это отличная идея, но я бы спросил (и неподдельный вопрос не критика). Тогда вы не рискуете раздуть вашу модель взгляда множеством избранных списков. Например, если ваша модель скажет 20 свойств, каждый из которых получает свою информацию из списка выбора, тогда у вас есть 20 списков выбора внутри вашей модели? Я имею в виду, если все, что вы делаете, это показать модель на форме (для чтения/только), что модель всегда несет эти накладные расходы? Если вам все равно нужно заполнить свою модель, действительно ли вам нужно использовать ViewBag. Если это так плохо, зачем предлагать эту функцию? – djack109

1

В моей мнение. Модель просмотра должна содержать все данные, необходимые для визуализации представления и доступные при создании представления.

Использование ViewBag для меня, как с помощью dynamic типа в коде - это дает вам некоторую гибкость, но приходит с ценой возможных ошибок, поэтому я стараюсь избегать, насколько possibe

4

Пример для руководства:

Я думаю, что лучший способ добиться того, что вам нужно, - использовать ViewModel. После этого вы загрузите материал, который хотите отобразить в своем представлении. Таким образом, вы должны создать раскрывающийся список с вашим списком учетных записей, который будет загружен в ваш контроллер. У вас также будет свой IEnumerable PErsoncontact, который также будет загружен в ваш контроллер. Затем ваш контроллер передаст ViewModel в представление. Вы можете использовать это как руководство.

ViewModel:

public class PersonViewModel 
{ 
    public int PersonID {get;set;} 
    public List<SelectListItem> PersonContactList {get;set;} 
    public IEnumerable<TypesAvail> TypesAvails{get;set;} 
} 

DROPDOWNLIST в Razor Вид:

@Html.DropDownListFor(m => m.PersonID , Model.PersonContactList) 

Edit: - Это пример .Yes вы можете создать новый класс в той же модели.

public class TypesAvail 
{ 
    public String TypeNme { get; set; } 
    public long TypeID { get; set; } 
    public int NumSelected { get; set; } 
    public int TypeCount { get; set; } 
    public IEnumerable<SelectListItem> CarsAvail 
    { 
     get 
     { 
      return new SelectList(
        Enumerable.Range(0, TypeCount+1) 
        .OrderBy(typecount => typecount) 
        .Select(typecount => new SelectListItem 
        { 
         Value = typecount.ToString(), 
         Text = typecount.ToString() 
        }), "Value", "Text"); 
     } 
    } 
} 

DROPDOWNLIST в Razor Вид:

@Html.DropDownListFor(m=> m.NumSelected, Model.CarsAvail) 
+0

-Я ценю все подходы. Этот пример кажется билетом. Пока у меня есть одно раскрывающееся меню. Я новичок в этом, и я пытался уйти от сумок и вещей вне модели. Так что хорошо сочетать выпадающие данные с остальными в модели? – kenmtb

+2

Отметьте обновленное сообщение –

+0

Отличный пример. Глупый вопрос: не m.NumSelected ссылаются на свойство TypeAvail.NumSelected, которое было бы пустым? Как-то нам нужно получить NumSelected из CarsAvail? – kenmtb

2

В том числе данных в модели The View или в ViewBag оба хорошие варианты, лучше всего один полностью зависит от конкретного случая использования.

Если выпадающий должны быть включены только один (или всего несколько) страниц, то имеет смысл быть частью ViewModel.

Если каждая страница должна иметь раскрывающийся список (если это входит в меню, или сноска, например), вы можете создать BaseController, который поставляет ViewBag данные для выпадающего списка, и пусть ваши другие контроллеры наследуют от:

BaseController.cs

public class BaseController : Controller 
{ 
    public BaseController() { 
     ViewBag.MyDroprown = ... 
    } 
} 

Любой другой контроллер

// inheriting from BaseController will make ViewBag.MyDroprown accessible in the View 
public class HomeController : BaseController 
{ 
    // Any actions here 
} 
Смежные вопросы