2015-01-30 3 views
0

У меня есть два списка dropDownLists, которые используются для заполнения данных в модели представления частичного представления. Один из dropDownLists каскадирует от другого. Когда я изменяю выбор родителя, дочерний источник данных не получает обновленное значение.Выбор опции в родительском DropDownList не отправляет обновленное значение дочернему элементу dropDownList

Это частичный вид (который может быть на странице несколько раз):

@model ViewModel 

@(Html.Kendo().DropDownListFor(m => m.Parent.Id) 
       .Name("Parent_" + Model.Id) 
       .OptionLabel("Select parent...") 
       .DataTextField("Text") 
       .DataValueField("Id") 
       .DataSource(source => 
       { 
        source.Read(read => 
        { 
         read.Action("GetParentOptions", "Controller"); 
        }); 
       }) 
) 

@(Html.Kendo().DropDownListFor(m => m.Child.Id) 
       .Name("Child_" + Model.Id) 
       .OptionLabel("Select child...") 
       .DataTextField("Text") 
       .DataValueField("Id") 
       .DataSource(source => 
       { 
        source.Read(read => 
        { 
         read.Action("GetChildOptions", "Controller", new { parentId = Model.Parent.Id }); 
        }) 
         .ServerFiltering(true); 
       }) 
       .Enable(false) 
       .AutoBind(false) 
       .CascadeFrom("Parent_" + Model.Id) 
) 

И здесь действия регулятора:

public JsonResult GetParentOptions() 
{ 
    var options = ParentService.GetOptions(); 

    return Json(options, JsonRequestBehavior.AllowGet); 
} 

public JsonResult GetChildOptions(int? parentId) 
{ 
    var options = ChildService.GetOptions(parentId); 

    return Json(options, JsonRequestBehavior.AllowGet); 
} 

ответ

1

Вы передаете неправильный ParentId к контроллеру , То, что ParentId - это тот, который приходит от модели, когда страница загружена и останется неизменной. То, что вам нужно передать контроллеру, - это ParentId, выбранный пользователем из раскрывающегося списка родителя. Вот как вы это делаете:

@(Html.Kendo().DropDownListFor(m => m.Parent.Id) 
    .Name("Parent_" + Model.Id) 
    .OptionLabel("Select parent...") 
    .DataTextField("Text") 
    .DataValueField("Id") 
    .DataSource(source => 
    { 
     source.Read(read => 
     { 
      read.Action("GetParentOptions", "Controller"); 
     }); 
    }) 
) 

@(Html.Kendo().DropDownListFor(m => m.Child.Id) 
    .Name("Child_" + Model.Id) 
    .OptionLabel("Select child...") 
    .DataTextField("Text") 
    .DataValueField("Id") 
    .DataSource(source => 
    { 
     source.Read(read => 
     { 
      read.Action("GetChildOptions", "Controller") 
        .Data("filterParentId"); 

     }) 
      .ServerFiltering(true); 
    }) 
    .Enable(false) 
    .AutoBind(false) 
    .CascadeFrom("Parent_" + Model.Id) 
) 

<script> 
    function filterParentId() { 
     return { 
      parentId: $("#[email protected]").val() 
     }; 
    } 
</script> 

Кстати, вам не нужно переопределять свойство Name. Когда вы используете DropDownListFor, имя будет выведено из имени правильности, исходящего от ModelMetadata.

UPDATE:

Я рекомендовал бы давая id на свои выпадающие списки вместо перезаписи name (если нужно). Вот как вы это делаете:

@(Html.Kendo().DropDownListFor(m => m.Parent.Id) 
    .OptionLabel("Select parent...") 
    .DataTextField("Text") 
    .DataValueField("Id") 
    .DataSource(source => 
    { 
     source.Read(read => 
     { 
      read.Action("GetParentOptions", "Controller"); 
     }); 
    }) 
    .HtmlAttributes(new { @id = "Parent_" + Model.Id })   
) 
+0

Это сработало, спасибо! Я использовал свойство Name, потому что я буду использовать его для использования в другом javascript-коде. Есть ли другой способ сделать это? – Kibner

+0

@ Kibner, Кендо уже назначил имя в раскрывающемся списке. Удалите свойство Name и посмотрите на источник в своем браузере, чтобы узнать, какое имя назначено. Имя - это имя свойства в вашей модели, но в вашем случае это немного сложнее, поэтому я прошу вас проверить источник страницы. Однако, если вы хотите присвоить свое имя, для простоты, я бы рекомендовал использовать идентификатор вместо имени. проверьте мой обновленный ответ. – ataravati

+0

Еще раз спасибо за вашу помощь! Я немного новичок в Kendo и до сих пор не полностью согласен с MVC, поэтому этот совет мне очень помогает. – Kibner