asp.net mvc 3 pré-seleciona Html.DropDownListFor não funciona no jantar nerd
Aprendendo sobre listas suspensas, estou tentando adicionar uma página de criação de RSVP para o nerddinner, como emBlog de Scott Gu com um Html.DropDownListPara listar jantares disponíveis.
Posso obter a lista suspensa preenchida, mas não posso selecioná-la para pré-selecionar o valor ("Sample Dinner 2") que eu quero. Estou usando um iniciador para propagar alguns objetos de jantar no banco de dados. O banco de dados é sql ce 4 usando uma EF 'primeira abordagem de código'. Desculpe, sei que este é um problema comum e odeio perguntar, mas sinceramente gastei algum tempo nisso, mas não consigo fazê-lo funcionar:
ViewModel
public class RSVPViewModel
{
public SelectList DinnersList { get; set; }
public RSVP Rsvp { get; set; }
public string SelectedItem { get; set; }
}
Controlador
//
//GET: /RSVP/Create
public ActionResult Create()
{
RSVP rsvp = new RSVP();
string selected = "Sample Dinner 2";
var typeList = new SelectList(dbc.Dinners.ToList(), "DinnerID", "Title", selected);
var viewModel = new RSVPViewModel { DinnersList = typeList, Rsvp = rsvp, SelectedItem = selected };
return View("Create", viewModel);
}
Visão
@Html.DropDownListFor(model => model.Rsvp.DinnerID, Model.DinnersList)
Resultado HTML
<select data-val="true" data-val-number="The field DinnerID must be a number." data-val-required="The DinnerID field is required." id="Rsvp_DinnerID" name="Rsvp.DinnerID">
<option value="1">Sample Dinner 1</option>
<option value="2">Sample Dinner 2</option>
</select>
Portanto, não está pré-selecionando a lista suspensa com o valor "Jantar de amostra 2" quando a página é carregada. A lista exibe ok e define o DinnerID correto quando eu faço uma seleção e clico em Enviar.
Tenta isso também:
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
mas não define nem vincula ao Rsvp.DinnerID.
Isso pré-seleciona da lista, mas não liga (ou define Rsvp.DinnerID)
@Html.DropDownList("DinnersList")
Eu quero mantê-lo mvc3, então quero implementar com tipo forte usando a abordagem ViewModel (sem ViewData) e preferencialmente usando Html.DropDownListFor (não Html.DropDownList) .Viewbag parece desnecessário para este caso.
Obrigado!
Edit1
Pensando que eu deveria estar usando um selectList de selectListItems, tentei esta abordagem detalhada:
RSVP rsvp = new RSVP();
string selected = "2";
List<SelectListItem> dinners = new List<SelectListItem>();
foreach (Dinner dinner in dbc.Dinners.ToList())
{
SelectListItem slDinner = new SelectListItem();
slDinner.Value = dinner.DinnerID.ToString();
slDinner.Text = dinner.Title;
slDinner.Selected = (slDinner.Value == selected);
dinners.Add(slDinner);
}
var dinnersList = new SelectList(dinners, "Value", "Text", selected);
var viewModel = new RSVPViewModel { DinnersList = dinnersList, Rsvp = rsvp, SelectedItem = selected };
No entanto ainda não funciona. Devo usar a propriedade ViewModel SelectedItem em: @ Html.DropDownListFor .. de alguma forma? Algo como :
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
<,/pre>but how to I get a selected value to set Rsvp.DinnerID. I think thats called binding.