2013-07-17 5 views
-1

Я много раз читал экспертов MVC, говоря, что если бы я использовал SelectList, лучше всего иметь IEnumerable<SelectList>, определенный в моей модели.
Например, в этом question.
Рассмотрим простой пример:Как использовать SelectList в представлении без модели?

public class Car() 
{ 
    public string MyBrand { get; set; } 
    public IEnumerable<SelectListItem> CarBrands { get; set; } // Sorry, mistyped, it shoudl be SelectListItem rather than CarBrand 
} 

В контроллере, люди будут делать:

public ActionResult Index() 
{ 
    var c = new Car 
    { 
     CarBrands = new List<CarBrand> 
     { 
      // And here goes all the options.. 
     } 
    } 
    return View(c); 
} 

Однако из Pro ASP.NET MVC, я узнал этот способ создания нового экземпляра.

public ActionResult Create() // Get 
{ 
    return View() 
} 
[HttpPost] 
public ActionResult Create(Car c) 
{ 
    if(ModelState.IsValid) // Then add it to database 
} 

Мой вопрос: Как я должен пройти SelectList для просмотра? Поскольку в методе Get нет существующей модели, похоже, я не могу этого сделать.
Я мог бы сделать это с помощью ViewBag, но мне сказали не использовать ViewBag, так как это вызывает проблемы. Мне интересно, какие у меня варианты.

+0

Если вы хотите передать данные с контроллера для просмотра, вы должны использовать либо mo del или ViewBag также могут использоваться ViewData. Без этого вы можете сделать статический вид. – Chandu

ответ

1

Вы можете создать ViewModel, который имеет все свойства автомобиля, которые вы хотите на вашей форме, то сделать ваш SelectList свойство этого ViewModel класса

public class AddCarViewModel 
{ 
    public int CarName { get; set; } 
    public string CarModel { get; set; } 
    ... etc 

    public SelectList MyList 
    { 
     get; 
     set; 
    } 
} 

Ваш контроллер будет выглядеть

public ActionResult Create() // Get 
{ 
    AddCarViewModel model = new AddCarViewModel(); 
    return View(model) 
} 

[HttpPost] 
public ActionResult Create(AddCarViewModel c) 
{ 
    if(ModelState.IsValid) // Then add it to database 
} 

MarkUp

@Html.DropDownListFor(@model => model.ListProperty, Model.MyList, ....) 
+0

Извините, я попробовал именно это раньше, но это не сработает. Проблема в том, что контроллер сначала направляется в Create HttpGet, где я не смог бы использовать какие-либо конкретные свойства модели, поскольку он просто использует 'return View()'. – octref

+0

И, кстати, это должен быть IEnumerable , правильно? – octref

+0

@octref Я удалил 'IEnumerable <...>'. Ваше представление create должно создать экземпляр модели представления со свойствами по умолчанию – codingbiz

Смежные вопросы