2013-12-04 5 views
8

Я работаю в ASP.NET MVC 5 (но это, скорее всего, относится и к предыдущим версиям). Лучший способ, чтобы задать этот вопрос, чтобы показать вам код:ASP.NET MVC SelectList в ViewModel

Вот является вид Модель:

public class PersonCreateViewModel 
{ 
    public SelectList cities {get; set;} 
    public String Name { get; set; } 
    public String Address { get; set; } 

} 

Вот метод HTTP Post от контроллера:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(PersonCreateViewModel viewmodel) 
{ 

    if (ModelState.IsValid) 
    { 
     //Add to database here and return 

    } 

    //return back to view if invalid db save 
    return View(person); 
} 

Вот Вид:

<div class="form-group"> 
     @Html.LabelFor(model => model.person.name, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
     @Html.EditorFor(model => model.person.name) 
     @Html.ValidationMessageFor(model => model.person.name) 
    </div> 
</div> 

<div class="form-group"> 
     @Html.LabelFor(model => model.person.address, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
     @Html.EditorFor(model => model.person.address) 
     @Html.ValidationMessageFor(model => model.person.address) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(model => model.person.CityID, "CityID", new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.DropDownList("cities") 
     @Html.ValidationMessageFor(model => model.person.CityID) 
    </div> 
</div> 

Когда пользователь нажимает кнопку «Отправить», в браузере появляется следующее сообщение об ошибке: "Нет конструктора без параметров, определенного для этого объекта. «

Я думаю, что это связано с тем, что у меня есть SelectList в моей модели ViewModel. Я думаю, что когда представление передает модель обратно контроллеру при отправке формы, он вызывает конструктор для SelectList, но там не конструктор без параметров для SelectList. Я не уверен, как поступить. Любая помощь приветствуется !!

+0

Полная трассировка стека? Нет причин, по которым здесь вызывается конструктор SelectList. –

+0

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

+0

Класс лица имеет без параметров construstor? –

ответ

18

у меня всегда была лучшая удача, используя IEnumerable

public class PersonCreateViewModel 
{ 
    public IEnumerable<SelectListItem> cities {get; set;} 
    public int CityId { get; set; } 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

Кроме того, вы будете нуждаться в свойство на модели вида для захвата выбранного значения, такого как CityId.

Тогда вы можете использовать:

Html.DropDownListFor(m => m.CityId, Model.cities) 
+1

Ненавижу говорить об этом, но я потерян. У меня теперь есть это: public IEnumerable города {get; задавать; }, и мне нужно заполнить его, прежде чем он будет передан в представление. Я имел это в своем контроллере: viewmodel.cities = new SelectList (db.Cities, «CityID», «name»); Теперь, когда это IEnumerable, как я могу заполнить раскрывающийся список. Извините, но мои навыки синтаксиса C# еще не так хороши. – carlg

+3

Я считаю, что SelectList реализует IEnumerable , чтобы вы могли назначить SelectList непосредственно в IEnumerable . Например, viewmodel.cities = new SelectList (db.Cities, "CityID", "name") все равно должен работать. –

+0

Есть ли разница между IEnumerable и List? – Muflix

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