2016-01-15 4 views
-1

Я добавил контроллер со следующим кодом.asp.net mvc 5.0 dropdownlist

TestDBEntities db = new TestDBEntities(); 

public ActionResult Populate() 
{ 
    var data = from d in db.Depts select d; 
    SelectList li = new SelectList(data, "DeptCode", "DeptName"); 
    ViewData["departments"] = li; 
    return View(); 
} 

[HttpPost] 
public ActionResult Populate(FormCollection form) 
{ 
    var str = form["departments"]; 
    ViewBag.d = str; 
    var data = from d in db.Depts select d; 
    SelectList li = new SelectList(data, "DeptCode", "DeptName",str); 
    ViewData["departments"] = li; 
    return View(); 
} 

также добавил представление для метода выше действий «Populate», как показано ниже разметок

@using (Html.BeginForm("Populate","Department", FormMethod.Post)) 
{ 
    @Html.DropDownList("departments", (SelectList)ViewData["departments"], "Select Dept", new { @onchange = "this.form.submit();" }) 
    <p>@ViewBag.d</p> 
} 

при выборе значения из DropDownList, она показывает выбранное значение. но не сохраняет выбор выпадающего списка.

Пожалуйста, предложите исправление. И также, пожалуйста, дайте мне знать, как я могу эффективно писать HttpPost.

ответ

0

Необходимо указать имущество, на которое вы ссылаетесь, и SelectList. Ваша попытка привязать выбранное значение к объекту ViewData с именем departments, который является типом IEnumerable<SelectListItem>, но элемент <select> может связываться только с простым значением (int, string и т. Д.).

Внутренне, что происходит, когда вы вернете вид в методе POST является

  1. Метод DropDownList() получает значение свойства вашего связывания с, что в вас дело "System.Meb.Mvc.SelectList" (значение из .ToString()ViewData["departments"])
  2. Поскольку значение свойства привязки, чтобы не null, нового IEnumerable<SelectListItem> генерируется из одного вы условия. Поскольку ни один из вариантов в вашем SelectList не соответствует "System.Meb.Mvc.SelectList", тогда Selected не является , поэтому первый вариант выбран, потому что что-то должно быть.

Обратите внимание, что установка 4-й параметр в SelectList конструктора игнорируется методом DropDownList()DropDownListFor()) за исключением того, когда значение первого параметра null

Чтобы сделать это правильно, начните с создания представления модель для представления того, что вы хотите отображать/редактировать и сильно привязывать к модели.

public class MyModel 
{ 
    [Required(ErrorMessage = "Please select a department")] 
    public string Department { get; set; } 
    public SelectList DepartmentList { get; set; } 
} 

и связанный с ним вид будет

@model MyModel 
@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.Department) 
    @Html.DropDownListFor(m => m.Department, Model.DepartmentList, "Select Department") 
    @Html.ValidationMessageFor(m => m.Department) 
    <input type="submit" value="Save" /> 
} 

и методы контроллера будут

public ActionResult Populate() 
{ 
    MyModel model = new MyModel(); 
    ConfigureViewModel(model); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Populate(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ConfigureViewModel(model); 
     return View(model); 
    } 
    // Save and redirect. 
} 

private void ConfigureViewModel(MyModel model) 
{ 
    model.DepartmentList = new SelectList(db.Depts, "DeptCode", "DeptName"); 
} 
+0

большое спасибо за ответ. но я хочу сделать это, не используя модель простым способом. – mayurb

+0

Что? Насколько проще вы хотите. И что вы подразумеваете под моделью? –

+0

означает, что не создается новый класс viewmodel, т. Е. MyModel. – mayurb