2012-06-20 11 views
9

Pracuję z KendoUI MVC w MVC3.Jak mogę ustawić i uzyskać wartość listy rozwijanej w siatce w Kendo UI MVC?

Udało mi się uzyskać listę rozwijaną w kolumnie siatki. Ale nie mam pojęcia, jak ustawić wybraną wartość, a po zapisaniu nie zapisuje wybranej wartości.

Siatka

@using Perseus.Areas.Communication.Models 
@using Perseus.Common.BusinessEntities; 


<div class="gridWrapper"> 
    @(Html.Kendo().Grid<CommunicationModel>() 
     .Name("grid") 
     .Columns(colums => 
     { 
      colums.Bound(o => o.communication_type_id) 
       .EditorTemplateName("_communicationDropDown") 
       .ClientTemplate("#: communication_type #") 
       .Title("Type") 
       .Width(180); 
      colums.Bound(o => o.sequence).Width(180); 
      colums.Bound(o => o.remarks); 
      colums.Command(command => command.Edit()).Width(50); 
     }) 
     .Pageable() 
     .Sortable() 
     .Filterable() 
     .Groupable() 
     .Editable(edit => edit.Mode(GridEditMode.InLine)) 
     .DataSource(dataSource => dataSource 
      .Ajax() 
      .ServerOperation(false) 
      .Model(model => model.Id(o => o.communication_id)) 
       .Read(read => read.Action("AjaxBinding", "Communication", new { id = @ViewBag.addressId })) 
       .Update(update => update.Action("Update", "Communication")) 
      .Sort(sort => { sort.Add(o => o.sequence).Ascending(); }) 
      .PageSize(20) 
     ) 
    ) 
</div> 

EditorTemplate „_communicationDropDown

@model Perseus.Areas.Communication.Models.CommunicationModel 


@(Html.Kendo().DropDownListFor(c => c.communication_type_id) 
     .Name("DropDownListCommunication") 
      .DataTextField("description1") 
      .DataValueField("communication_type_id") 
      .BindTo(ViewBag.CommunicationTypes)) 
+1

Czy otrzymałeś y rozwiązanie? Mam ten sam problem. Mogę wyświetlić tekst z rozwijanej listy, Jak mogę ustawić wartość. –

+0

Wygląda na to, że problem został rozwiązany. Czy mógłbyś wyjaśnić, co to jest pole "typ_komunikacji"? w swoim clientTemplate? –

+0

Gdzie definiujesz '.ClientTemplate (" #: communication_type # ")'? Czy możesz wysłać swojego kontrolera z całej sieci? –

Odpowiedz

18

myślę, że to jest ważne, aby zwrócić uwagę na to, że nazwa DropDownList powinna odpowiadać atrybut nazwa kolumny. Html nazwę atrybutu = "", a nie nagłówek kolumny. Atrybuty nazwy muszą pasować, aby to działało, ponieważ zastępujesz domyślny formant edytora innym formantem pochodzącym z szablonu edytora, aby zajął jego miejsce podczas operacji edycji. nie pasuje gdy DOM jest serializowany z powrotem do modelu operacji aktualizacji, wartość z formantu szablonu edytora zostanie zignorowana. Domyślnie jest to nazwa zmiennej właściwości, która pojawia się w klasie modelu, chyba że zostanie nadpisana w oznaczeniu.

(Odpowiedź edytowana w celu uwzględnienia operacji wstawiania rekordu).

Oto przykład roboczych:

modelu Klasa:

public class Employee 
{ 
    public int EmployeeId { get; set; } 
    public string Name { get; set; } 
    public string Department { get; set; } 
} 

Widok:

@(Html.Kendo().Grid<Employee>() 
    .Name("Grid") 
    .Columns(columns => 
    { 
     columns.Bound(p => p.Name).Width(50); 
     columns.Bound(p => p.Department).Width(50).EditorTemplateName("DepartmentDropDownList"); 
     columns.Command(command => command.Edit()).Width(50); 
    }) 
    .ToolBar(commands => commands.Create()) 
    .Editable(editable => editable.Mode(GridEditMode.InLine)) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Model(model => model.Id(p => p.EmployeeId)) 
     .Read(read => read.Action("GetEmployees", "Home")) 
     .Update(update => update.Action("UpdateEmployees", "Home")) 
     .Create(create => create.Action("CreateEmployee", "Home")) 
    ) 
) 

Częściowa szablon widoku redaktor, nazwa pliku "DepartmentDropDownList", znajduje się w folderze EditorTemplates że jest specyficzny dla tego widoku. to znaczy. Home \ Views \ EditorTemplates \ DepartmentDropDownList.cshtml

@model string 

@(Html.Kendo().DropDownList() 
    .Name("Department") //Important, must match the column's name 
    .Value(Model) 
    .SelectedIndex(0) 
    .BindTo(new string[] { "IT", "Sales", "Finance" })) //Static list of departments, can bind this to anything else. ie. the contents in the ViewBag 

Controller dla operacji odczytu:

public ActionResult GetEmployees([DataSourceRequest]DataSourceRequest request) 
{ 
    List<Employee> list = new List<Employee>(); 
    Employee employee = new Employee() { EmployeeId = 1, Name = "John Smith", Department = "Sales" }; 
    list.Add(employee); 
    employee = new Employee() { EmployeeId = 2, Name = "Ted Teller", Department = "Finance" }; 
    list.Add(employee); 

    return Json(list.ToDataSourceResult(request)); 
} 

kontroler dla operacji UPDATE:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult UpdateEmployees([DataSourceRequest] DataSourceRequest request, Employee employee) 
{ 
    return Json(new[] { employee }.ToDataSourceResult(request, ModelState)); 
} 

kontroler dla operacji Create:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateEmployee([DataSourceRequest] DataSourceRequest request, Employee employee) 
{ 
    employee.EmployeeId = (new Random()).Next(1000); 
    return Json(new[] { employee }.ToDataSourceResult(request, ModelState)); 
} 
+1

* Facepalm * Nie mogę uwierzyć, że o tym nie myślałem. Zmiana nazwy listy rozwijanej na pasującą nazwę kolumny działa jak urok! Dziękuję Ci bardzo! – bjornruysen

+0

Nie mogę znaleźć żadnych dobrych przykładów EditorTemplateName. Czy możesz wyjaśnić czym jest "DepartmentDropDownList"? częściowy widok lub ascx iw jakim folderze powinienem go umieścić? –

+1

Wyobrażam sobie. Musisz umieścić go w folderze EditorTemplates dla bieżącego kontrolera (lub wspólnego) folderu widoku. –

Powiązane problemy