2014-10-24 4 views
0

Может кто-то, пожалуйста, помогите мне понять, как работает Html.DropDownListFor? У меня есть модель, которая выглядит следующим образомHtml.DropDownListFor confusion

public class TestModel 
{ 
    public IList<SelectListItem> ProductNames { get; set; } 
    public string Product { get; set; } 
} 

призыв к DropDownListFor который выглядит как

@Html.DropDownListFor(model => model.ProductNames, Model.ProductNames, "Select a Product", new {@class="selectproductname" }) 

С этой настройки я считаю, что выпадающий список получает заполняется правильно, однако после подачи формы I похоже, не может получить выбранный элемент. Кроме того, из того, что я прочитал призыв к Html.DropDownListFor должно выглядеть на самом деле

@Html.DropDownListFor(model => model.Product, Model.ProductNames, "Select a Product", new {@class="selectproductname" }) 

На самом деле другие части коды выглядеть так хорошо, но когда я делаю это выпадающий список не заселяются. Я что-то упустил?

Пара боковых нот: 1) Население этого ниспадающего происходит после выбора значения из другого выпадающего списка, так что я сделать вызов AJAX, вызвав getJSON, чтобы получить данные из базы данных 2) Приложение является приложение MVC

Поблагодарили бы за помощь. Дайте мне знать, если вам нужна любая другая информация, которая поможет ответить на этот вопрос

Edit: Вот еще некоторые детали

Это метод действия в контроллере используется для получения данных для выпадающего

[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); 
    } 

И это призыв JQuery к действию в контроллере

$("#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 
          })); 
         }); 
        } 
       }); 
    }); 

Именно это $ .each цикл, который Безразлично» т получить заключенным, если я использую модель => model.Product даже если данные возвращаются в переменных данных

+0

Второе использование является правильным. Значение 'Property' будет значением выбранного параметра, но вы не указали, как вы заполняете параметры в вашем аякс-вызове, поэтому его трудно узнать, где вы проблема. –

+0

Покажите нам, как вы заполнили 'IList ProductNames' Все зависит от' '' '' '' SelectListItem'. Как сказал @StephenMuecke, 2-е использование правильное, если вы присваиваете 'Product' значение' Value' части 'ProductNames' ListItem –

+0

, когда вы используете' model => model.Product' в обратном вызове ajax-использования, как это: var select = $ («#Product») 'или' var select = $ (". Selectproductname") 'selector может быть' # id' или '.classname' –

ответ

1

Второе использование является правильным, однако при использовании

@Html.DropDownListFor(model => model.Product, ..... 

вы генерируете <select> с атрибутом id="Product" так что вам нужно изменить сценарий, чтобы обратиться к элементу с этим ID

.... 
$.getJSON("CoaLookup/LoadProductsBySupplier", { parentId: pID }, function (data) { 
    var select = $("#Product"); // change this selector 
    select.empty(); 
    .... 

Редактировать

В качестве стороны нет, вам необязательно создавать SelectList в методе контроллера и вы код может быть упрощен до

[AcceptVerbs(HttpVerbs.Get)] 
public JsonResult LoadProductsBySupplier(int parentId) 
{ 
    List<int> ctgyIds = _categoryService.GetAllCategoriesByParentCategoryId(parentId).Select(c => c.ID).ToList(); 
    var products= _productService.SearchProducts(categoryIds: ctgyIds, storeId: _storeContext.CurrentStore.Id, orderBy: ProductSortingEnum.NameAsc).AsEnumerable().Select(p => new 
    { 
    ID = p.ID, 
    Text = p.Name.Substring(m.Name.IndexOf(' ') + 1) 
    }); 
    return Json(products, JsonRequestBehavior.AllowGet); 
} 

и сценарий

$("#Supplier").change(function() { 
    var pID = $(this).val(); 
    var select = $("#Product").empty().append($('<option/>').text('Select A Product')); 
    if (pID == '0') { return; } // this should really be testing for null or undefined but thats an issue with your first select   
    $.getJSON('@Url.Action("LoadProductsBySupplier", "CoaLookup")', { parentId: $(this).val() }, function (data) { 
    $.each(data, function (index, item) { 
     select.append($('<option/>').val(item.ID).text(item.Text); 
    }); 
    }); 
}); 

Примечание также в скрипте пункте if перед тем $.getJSON - нет особого смысла вызова сервера, то решая игнорировать возвращаемое значение

+0

Спасибо, что Стефен и я очень ценю, что вы даете мне советы о том, как улучшить код. Я всегда стараюсь искать такой совет – jjvad

0

Чтобы получить выбранное значение в странице редактирования можно использовать:

@Html.DropDownList("name", new SelectList(ViewBag.Product, "Id","Name", item.Id)) 

в этом в item-id это выбранное значение, а ViewBag.Product вы должны заполнить его из своих продуктов, используя linq, например, в контроллере.

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