2012-06-20 7 views
9

Ich arbeite mit KendoUI MVC in MVC3.Wie kann ich den Wert einer Dropdownliste in einem Grid in Kendo UI MVC festlegen und abrufen?

Ich habe es geschafft, ein Dropdown in einer Rasterspalte zu bekommen. Aber ich habe keine Ahnung, wie ich den ausgewählten Wert einstellen soll, und wenn ich ihn speichere, wird der ausgewählte Wert nicht gespeichert.

Das Gitter

@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> 

Die 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

Haben Sie einen bekommen? y Lösung? Ich habe das gleiche Problem. Ich kann Text in Dropdown-Liste anzeigen, wie kann ich Wert festlegen. –

+0

Scheint, das Problem ist gelöst, könnten Sie bitte klären, was das Feld "communication_type" ist? in Ihrem ClientTemplate? –

+0

Wo definieren Sie '.ClientTemplate (" #: communication_type # ")'? Kannst du bitte deinen Controller vom gesamten Grid posten? –

Antwort

18

Ich denke, dies ist ein sehr wichtiger ist darauf hinzuweisen, dass der Dropdownlist Name des Spaltennamen Attribut übereinstimmen soll. Die HTML-Name-Attribut = "", nicht die Überschrift der Spalte. Die Namensattribute müssen übereinstimmen, damit dies funktioniert, da Sie das Standardeditorsteuerelement durch ein anderes Steuerelement ersetzen, das von einer Editorvorlage stammt, um während des Editiervorgangs seinen Platz einzunehmen nicht übereinstimmen Wenn das DOM wieder in das Modell für die Aktualisierungsoperation serialisiert wird, wird der Wert aus der Editorvorlagensteuerung ignoriert. Standardmäßig ist dies der Name der Eigenschaftsvariablen, der in der Modellklasse angezeigt wird, es sei denn, er wurde in der Markierung überschrieben.

(Die Antwort wurde so bearbeitet, dass sie den Datensatz einfügen enthält). Hier

ist ein funktionierendes Beispiel:

Model-Klasse:

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

Ausblick:

@(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")) 
    ) 
) 

Teilansicht Editor-Vorlage, Dateiname "DepartmentDropDownList", das sich im EditorTemplates Ordner, dass ist spezifisch für diese Ansicht. dh. 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 für den Lesevorgang:

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

Controller für den Aktualisierungsvorgang:

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

Controller für den Betrieb erstellen:

[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 * Ich kann nicht glauben, dass ich nicht daran gedacht habe. Ändern Sie den Namen des Dropdown-Menüs in den passenden Spaltennamen wie ein Charme! Vielen Dank! – bjornruysen

+0

Kann keine guten Beispiele für EditorTemplateName finden. Können Sie klären, was "DepartmentDropDownList" ist? eine Teilansicht oder Ascx, und in welchem ​​Ordner sollte ich es platzieren? –

+1

Herausgefunden. Sie müssen es im EditorTemplates-Ordner für den aktuellen (oder allgemeinen) View-Ordner des aktuellen Controllers platzieren. –

Verwandte Themen