Html.DropDownListFor confusão
Alguém por favor pode me ajudar a entender como funciona o Html.DropDownListFor? Eu tenho um modelo que é o seguinte
public class TestModel
{
public IList<SelectListItem> ProductNames { get; set; }
public string Product { get; set; }
}
A chamada para DropDownListFor que parece
@Html.DropDownListFor(model => model.ProductNames, Model.ProductNames, "Select a Product", new {@class="selectproductname" })
Com essa configuração, acho que a lista suspensa é preenchida corretamente, no entanto, após o envio do formulário, não consigo obter o item selecionado. Também pelo que li a chamada para Html.DropDownListFor, na verdade, deve parecer
@Html.DropDownListFor(model => model.Product, Model.ProductNames, "Select a Product", new {@class="selectproductname" })
De fato, outras partes do código também se parecem com isso, mas quando faço isso, a lista suspensa não está sendo preenchida. Estou faltando alguma coisa aqui?
Algumas anotações: 1) A população desse menu suspenso ocorre após a seleção de um valor de outro menu suspenso; portanto, faço uma chamada AJAX chamando getJSON para obter dados do banco de dados 2) O aplicativo é um aplicativo MVC
Gostaria de receber qualquer ajuda oferecida. Entre em contato se precisar de outras informações para ajudar a responder a esta pergunta
Edit: Aqui estão mais alguns detalhes
Este é o método de ação no controlador usado para recuperar os dados para o menu suspenso
[AcceptVerbs(HttpVerbs.Get)]
public JsonResult LoadProductsBySupplier(string parentId)
{
var ctgy = this._categoryService.GetAllCategoriesByParentCategoryId(Convert.ToInt32(parentId));
List<int> ctgyIds = new List<int>();
foreach (Category c in ctgy)
{
ctgyIds.Add(c.Id);
}
var prods = this._productService.SearchProducts(categoryIds: ctgyIds, storeId: _storeContext.CurrentStore.Id, orderBy: ProductSortingEnum.NameAsc);
products = prods.Select(m => new SelectListItem()
{
Value = m.Id.ToString(),
Text = m.Name.Substring(m.Name.IndexOf(' ') + 1)
});
var p = products.ToList();
p.Insert(0, new SelectListItem() { Value = "0", Text = "Select A Product" });
products = p.AsEnumerable();
//model.ProductNames = products.ToList();
return Json(products, JsonRequestBehavior.AllowGet);
}
E esta é a chamada JQuery para a ação no controlador
$("#Supplier").change(function () {
var pID = $(this).val();
$.getJSON("CoaLookup/LoadProductsBySupplier", { parentId: pID },
function (data) {
var select = $("#ProductNames");
select.empty();
if (pID != "0") {
$.each(data, function (index, itemData) {
select.append($('<option/>', {
value: itemData.Value,
text: itemData.Text
}));
});
}
});
});
É esse loop $ .each que não é inserido quando uso model => model.Product mesmo que os dados sejam retornados nos dados variáveis