2014-02-09 2 views
1

У меня есть простой фрагмент кода, который пытается заполнить список из трех стран и по умолчанию выбрать 2-й элемент. По какой-то причине @ Html.DropDownList не инициализирует второй элемент на экране. Может кто-то указать, что не так с этим кодом?@ Html.DropDownList не может инициализировать значение

public class DemoController : Controller 
{ 
    [HttpGet] 
    public ActionResult Test() 
    { 
     List<SelectListItem> ddlCountries = new List<SelectListItem>(); 
     SelectListItem item1 = new SelectListItem { Selected = false, Text = "USA", Value = "1" }; 
     SelectListItem item2 = new SelectListItem { Selected = true, Text = "Ireland", Value = "2" }; 
     SelectListItem item3 = new SelectListItem { Selected = false, Text = "UK", Value = "3" }; 

     ddlCountries.Add(item1); 
     ddlCountries.Add(item2); 
     ddlCountries.Add(item3); 

     ViewBag.ddlCountries = ddlCountries; 
     return View(); 
    } 

    [HttpPost] 
    public string Test(string ddlCountries) 
    { 
     return "The selected Value was " + ddlCountries; 
    } 
} 

Ниже является выход на экран ..

Screen Output

Окно quickwatch показывает, что свойство "Selected" правильно присвоено значение "2", тем не менее экран не отражает это.

Quickwatch output

Код для зрения является следующая

@{ 
    ViewBag.Title = "Test"; 
} 

<h2>Test</h2> 

@using (Html.BeginForm("Test", "Demo", FormMethod.Post)) 
{ 

@Html.DropDownList("ddlCountries", (IEnumerable<SelectListItem>) ViewBag.ddlCountries) 
    <br /> 
    <input type="submit" value="submit" /> 
} 
+0

Вы можете попытаться использовать объект 'SelectList' вместо' IEnumerable 'obje кт. –

+1

@codingstill, и как это иначе? Кстати, 'SelectList' реализует' IEnumerable '. –

ответ

6

Попробуйте использовать модель представления, это гораздо проще, безопаснее и чище:

public class MyViewModel 
{ 
    public string SelectedCountryId { get; set; } 
    public IEnumerable<SelectListItem> Countries { get; set; } 
} 

, а затем в контроллере:

public class DemoController : Controller 
{ 
    [HttpGet] 
    public ActionResult Test() 
    { 
     List<SelectListItem> ddlCountries = new List<SelectListItem>(); 
     SelectListItem item1 = new SelectListItem { Text = "USA", Value = "1" }; 
     SelectListItem item2 = new SelectListItem { Text = "Ireland", Value = "2" }; 
     SelectListItem item3 = new SelectListItem { Text = "UK", Value = "3" }; 

     ddlCountries.Add(item1); 
     ddlCountries.Add(item2); 
     ddlCountries.Add(item3); 

     var model = new MyViewModel(); 
     model.Countries = ddlCountries; 
     model.SelectedCountryId = "2"; // preseleted Ireland 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Test(MyViewModel model) 
    { 
     return Content("The selected Value was " + model.SelectedCountryId); 
    } 
} 

и, наконец, в вашем строго типизированном виде:

@model MyViewModel 
@{ 
    ViewBag.Title = "Test"; 
} 

<h2>Test</h2> 

@using (Html.BeginForm("Test", "Demo", FormMethod.Post)) 
{ 
    @Html.DropDownListFor(x => x.SelectedCountryId, Model.Countries) 
    <br /> 
    <input type="submit" value="submit" /> 
} 

и это почти правильный подход. Забудьте о любом материале ViewBag. Просто используйте модель представления. Единственным источником информации для представления должна быть модель представления.

Кстати действие контроллера GET может быть упрощена:

[HttpGet] 
public ActionResult Test() 
{ 
    var model = new MyViewModel(); 
    model.Countries = new[] 
    { 
     new SelectListItem { Text = "USA", Value = "1" }, 
     new SelectListItem { Text = "Ireland", Value = "2" }, 
     new SelectListItem { Text = "UK", Value = "3" }, 
    }; 
    model.SelectedCountryId = "2"; // preseleted Ireland 

    return View(model); 
} 

или страны могут быть непосредственно связаны в вашей модели представления:

public class MyViewModel 
{ 
    public string SelectedCountryId { get; set; } 
    public IEnumerable<SelectListItem> Countries 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Text = "USA", Value = "1" }, 
       new SelectListItem { Text = "Ireland", Value = "2" }, 
       new SelectListItem { Text = "UK", Value = "3" }, 
      }; 
     } 
    } 
} 

, а затем контроллер становится еще тоньше:

public class DemoController : Controller 
{ 
    [HttpGet] 
    public ActionResult Test() 
    { 
     var model = new MyViewModel(); 
     model.SelectedCountryId = "2"; // preseleted Ireland 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Test(MyViewModel model) 
    { 
     return Content("The selected Value was " + model.SelectedCountryId); 
    } 
} 
+0

Спасибо, Дарин. Это работает для меня сейчас. –

+0

@KarticKalyan, если этот пост помог вам решить проблему, с которой вы столкнулись, вы можете рассмотреть ее как ответ, нажав на галочку рядом с ней: http://meta.stackexchange.com/questions/5234/how-does-accepting -an-ответ-работы –

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