2014-09-03 4 views
2

У меня есть компонент DropDownListFor, который имеет действие чтения, которое получает значения из базы данных. Тем не менее, я хочу отфильтровать эти значения на основе значения другого DropDownListFor.Передача значения kendo DropDownListДля чтения действия другого DropDownListFor

Вот компонент DropDownListFor, который имеет значение фильтра

 <div class="editor-field"> 
         @(Html.Kendo().DropDownListFor(model => model.ReleaseID) 
         .DataTextField("Value") 
         .DataValueField("Key") 
         .DataSource(ds => ds 
          .Read(read=>read.Action("GetReleases", "Task")) 
          ) 
         ) 
      @Html.ValidationMessageFor(model => model.ReleaseID) 
      </div> 

То, что я хочу сделать, это передать значение ReleaseID в действие чтения другого DropDownListFor. Я попытался сделать это следующим образом:

   <div class="editor-field"> 
       @(Html.Kendo().DropDownListFor(model => model.MarketModelID) 
         .Events(e => e.Select("onSelectMarketModel")) 
         .Template("<span data-title='Model Description: #: data.Item3 #'>#: data.Item2 # </span>") 
         .DataTextField("Item2") 
         .DataValueField("Item1") 
         .DataSource(ds => ds 
          .Read(read => read.Action("GetMarketModels", "Task", new { release = Model.ReleaseID })) 
       )) 
       @Html.ValidationMessageFor(model => model.MarketModelID) 
      </div> 

с методом контроллера подписи:

public JsonResult GetMarketModels(int? release) 
{ 
    //code to get market models based on release 
} 

Однако выпуск в методе GetMarketModels не всегда 0, независимо от того, что выбор для ReleaseID DropDownFor на Вверх. Что я делаю не так?

спасибо.

ответ

1

Вам необходимо использовать каскадные списки DropDownLists. Здесь вы можете найти пример того, как создать каскадные DropDownLists:

Cascading DropDownList

+0

Спасибо! Я попытался реализовать этот пример, но по какой-то причине я не могу заставить дочерний элемент управления обновляться, когда выбор изменяется в родительском элементе управления. Поскольку для этого элемента установлено значение false, он никогда не будет сброшен. Я что-то упускаю? –

+0

Можете ли вы обновить свой вопрос, чтобы включить код для каскадных DropDownLists, которые вы пробовали? – ataravati

+0

На самом деле, я понял, что сделал каскадное обратное, поэтому код не работал. Теперь все работает правильно. Еще раз спасибо! –

2

Я не очень нравится, например, таким образом, я думал, что я по буквам, как вы идете от того, что у вас есть, чтобы что должно работать - и для моей собственной выгоды, Ваш, и другие читают это:

во-первых, вам нужен атрибут Имя на ReleaseID:

@(Html.Kendo().DropDownListFor(model => model.ReleaseID) 
    .Name("ReleaseID") // <-- needs this line added 
    .DataTextField("Value") 
    .DataValueField("Key") 
    .DataSource(ds => ds 
     .Read(read=>read.Action("GetReleases", "Task")) 
    ) 
) 

Далее, вам нужно положить в .Data(), указать функцию что дает вам R eleaseID, указать, что вы делаете .ServerFiltering(true) и .Cascade с другого выпадающего списка, и создать функцию, заданную для возврата, в формате JSON, выпуск ID для использования в каскаде:

@(Html.Kendo().DropDownListFor(model => model.MarketModelID) 
    .Events(e => e.Select("onSelectMarketModel")) 
    .Template("<span data-title='Model Description: #: data.Item3 #'>#: data.Item2 # </span>") 
    .DataTextField("Item2") 
    .DataValueField("Item1") 
    .DataSource(source => 
    { 
     source.Read(read => 
     { 
      read.Action("GetMarketModels", "Task").Data("filterMarket"); 
     }) 
     .ServerFiltering(true); 
    }) 
    .CascadeFrom("ReleaseID") // <-- "Name" attribute, from above 
    .Value(Model.MarketModelID != null ? Model.MarketModelID.ToString() : "1") 
) 
<script> 
    function filterMarket() { 
     return { 
      strReleaseID : $("#ReleaseID").val() 
     } 
    } 
</script> 

Тогда в вашей задаче контроллер, вы передаете в переменной:

public JsonResult GetMarketModels(string strReleaseID) 
{ 
    int releaseID = int.Parse(strReleaseID); 
    var data = db.MarketModels.Where(t => t.ReleaseID == releaseID).ToList(); 
    return Json(data, JsonRequestBehavior.AllowGet); 
} 

Обратите внимание, что имя, которое вы дали параметр в JavaScript должен совпадать с именем в функции контроллера. Этот метод - это то, что я использовал для каскадирования выпадающих списков в приложении и работает для меня.

+1

Большое спасибо, вы сохранили мою жизнь. У меня эта проблема в течение 2 дней, он он. –

+0

Рад, что я мог помочь! Определенно используйте поиск здесь, чтобы найти ответы! Или ударил меня в GMail. Может быть, я даже позволю тебе купить мне обед. :) – vapcguy

+1

hehe ... Спасибо, я буду –