2017-03-27 3 views
0

Ich baue eine Benutzerprofilseite für eine Anwendung. Auf dieser Seite kann der Benutzer grundlegende Datenfelder (Nachname, Vorname usw.) anzeigen und bearbeiten. Außerdem gibt es ein Raster von Benutzern, mit denen sie verknüpft sind. Der Benutzer sollte einige grundlegende CRUD-Vorgänge in diesem Raster durchführen können. Wie kann ich dieses Gitter an ein IEnumerable (oder vergleichbar) binden, das als Eigenschaft des Viewmodels an die Ansicht übergeben wird?Gitter an ein IEnumerable im Ansichtsmodell der Ansicht binden

Die Ansicht Modell ist so etwas:

using System.Collections.Generic; 

namespace Pricing.Models.ViewModel 
{ 
    public class UserProfileUpdateViewModel 
    { 
     public int UserId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public IEnumerable<LinkedUserViewModel> LinkedUsers { get; set; } 
    } 
} 

Meine Benutzerprofilansicht zur Zeit etwa wie folgt aussieht. Beachten Sie den TODO-Kommentar in Zeile 38, der anzeigt, was gerade kaputt ist.

@model Pricing.Models.ViewModel.UserProfileUpdateViewModel 
<div class="panel-body"> 
    <h2>User Profile</h2> 
    @using (Html.BeginForm("UpdateProfile", "Account", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     @Html.HiddenFor(profile => profile.UserId) 
     <div class="form-horizontal"> 
      <div class="form-group"> 
       <label class="control-label col-md-2">Username</label> 
       <div class="col-md-10" style="padding-top:7px"> 
        @User.Identity.Name 
       </div> 
      </div> 
     </div> 
     <div class="form-horizontal"> 
      <div class="form-group"> 
       @Html.LabelFor(profile => profile.FirstName, "First Name", new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(profile => profile.FirstName, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(profile => profile.FirstName, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
     </div> 
     <div class="form-horizontal"> 
      <div class="form-group"> 
       @Html.LabelFor(profile => profile.LastName, "Last Name", new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.EditorFor(profile => profile.LastName, new { htmlAttributes = new { @class = "form-control" } }) 
        @Html.ValidationMessageFor(profile => profile.LastName, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
     </div> 
     <div class="form-horizontal"> 
      <div class="form-group"> 
       @Html.LabelFor(profile => profile.LinkedUsers, "Linked Users", new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        //TODO: This bind fails, I need to bind to the IENumerable property of UserProfileUpdateViewModel 
        @(Html.Kendo().Grid<Freds.Retail.DirectPricing.Models.ViewModel.UserProfileUpdateViewModel>() 
         .Name("LinkedUsers") 
         .ToolBar(tools => 
         { 
          tools.Create().Text("Add Linked User"); 
         }) 
         .Editable(editable => editable.Mode(GridEditMode.InCell).CreateAt(GridInsertRowPosition.Bottom).DisplayDeleteConfirmation(false)) 
         .Columns(columns => 
         { 
          columns.Bound(p => p.LinkedUsersId).Visible(false).ClientTemplate("#= Id #" + 
          "<input type='hidden' name='LinkedUsers[#= index(data) #].Id' value='#= Id #' />" 
          ); 
          columns.Bound(p => p.LinkedUserName).Visible(false).ClientTemplate("#= LinkedUserName #" + 
          "<input type='hidden' name='LinkedUsers[#= index(data) #].LinkedUserName' value='#= LinkedUserName #' />" 
          ); 
          columns.Command(command => command.Destroy()).Width(110); 
         }) 
         .Scrollable() 
         .Sortable() 
         .HtmlAttributes(new { style = "width:75%" }) 
         .DataSource(source => source 
          .Ajax() 
          .Model(model => 
          { 
           model.Id(d => d.Id); 
          }) 
          .Batch(true) 
          .ServerOperation(false) 
          .Events(events => events.Error("error_handler")) 
          .Read(read => read.Action("LinkedUser_Read", "Account")) 
         ) 
        ) 
       </div> 
      </div> 
     </div> 
     <div class="form-horizontal"> 
      <div class="form-group"> 
       <label class="control-label col-md-2"></label> 
       <div class="col-md-10"> 
        <input type="submit" value="Save Changes" class="btn btn-default" /> 
       </div> 
      </div> 
     </div> 
    } 
</div> 

Antwort

1

Sie sollten IEnumerable selbst nicht den Typ übergeben.

@(Html.Kendo().Grid<Model.LinkedUsers>() 
+0

Ah. OK danke. Ich denke, das macht Sinn. Also, sollte ich die IEnumerable-Eigenschaft insgesamt aus UserProfileUpdateViewModel entfernen? Da denke ich, dass der Read-Wert der IEnumerable-Eigenschaft null sein wird, wenn das Raster an sein eigenes LinkedUsers-Modell gebunden ist. Ich bin immer noch unscharf darüber, wie ich Funktionen zum Erstellen, Aktualisieren oder Zerstören auf dem Gitter zurückgeben werde, wenn die Daten des Gitters nicht Teil des UserProfileUpdateViewModels sind. –

+1

@ CollinM.Barrett Warum es entfernen?, Sie können einfach überprüfen, ob List ist Null im Falle von Erstellen, um das Raster nicht zu rendern, und rendern es nur im Falle von Update/Delete. Informationen zum Hinzufügen/Erstellen/Löschen können Sie dem Beispiel http://docs.telerik.com/aspnet-mvc/helpers/grid/editing/server-editing entnehmen –

Verwandte Themen