2015-01-22 6 views
1

У меня есть следующий asp.net WebGrid внутри мой взгляд бритвы: -Как напрямую получить доступ к элементам внутри моего WebGrid

@model SkillManagement.Models.PagedList<SkillManagement.Models.Staff> 

@{ 
    ViewBag.Title = "Index"; 
} 

<div class="well"> 
    @using (Html.BeginForm("index", null, FormMethod.Get)) 
    { 
     <div class="row">There are @Model.TotalRecords item.</div> 
     <div class="row"> 
      <div class="col-sm-8"> 
       <div class="input-group"> 

        <input type="text" 
         name="filter" 
         value="@ViewBag.filter" 
         class="form-control" 
         style="display: inline" 
         placeholder="Search by First & Last Name" /> 
        <span class="input-group-btn"> 
         <button class="btn btn-default" type="submit">Go</button> 
        </span> 

       </div> 
      </div> 
      <div class="pull-right col-lg-1"> 
       <a class="btn btn-success" data-modal="" href="/Staff/Create" id="btnCreate"> 
        <span class="glyphicon glyphicon-plus"></span>  
       </a> 
      </div> 
     </div> 

     <div style="margin-top:17px;"> 
      @{ 
      var grid = new WebGrid(
         canPage: true, 
         rowsPerPage: Model.PageSize, 
         canSort: true, 
         ajaxUpdateContainerId: "grid"); 

      grid.Bind(Model.Content, rowCount: Model.TotalRecords, autoSortAndPage: false); 
      grid.Pager(WebGridPagerModes.All); 

      @grid.GetHtml(htmlAttributes: new { id = "grid" }, // id for ajaxUpdateContainerId parameter 
      fillEmptyRows: false, 
      tableStyle: "table table-bordered table-hover", 
      mode: WebGridPagerModes.All, 
      columns: grid.Columns(
       grid.Column("FirstName", Html.DisplayNameFor(model => model.Content.FirstOrDefault().FirstName).ToString()), 
       grid.Column("LastName", Html.DisplayNameFor(model => model.Content.FirstOrDefault().LastName).ToString()), 
       grid.Column("PrimaryRole", Html.DisplayNameFor(model => model.Content.FirstOrDefault().PrimaryRole).ToString()), 
       grid.Column("SecondaryRole", Html.DisplayNameFor(model => model.Content.FirstOrDefault().SecondaryRole).ToString()), 
       grid.Column("Skill",canSort:false,format: 

       @<text> 
      @foreach (var c in item.SkillLevelStaffs) 
{ 
    @c.Skill.Name; 
} 


        </text>), 
       grid.Column("Actions",canSort:false,format: 

       @<text> 



        <a data-modal='' href="/Staff/details/@item.StaffID" id="@item.StaffID" title="Details"> <span class='glyphicon glyphicon-search'> </span> </a> 
        <a data-modal='' href="/Staff/edit/@item.StaffID" id="@item.StaffID" title="Edit"> <span class='glyphicon glyphicon-edit'> </span> </a> 
        @if(item.ISActive){<a data-modal='' href="/Staff/Deactivate/@item.StaffID" id="@item.StaffID" title="Deactivate"> <span class='glyphicon glyphicon-alert'> </span> </a>} 
      else if(!item.ISActive){<a data-modal='' href="/Staff/delete/@item.StaffID" id="@item.StaffID" title="Delete"> <span class='glyphicon glyphicon-trash'> </span> </a>} 
       </text> 
         ) 

      )); 
      } 


     </div> 
    } 
</div> 


<!-- modal placeholder--> 
<div id='myModal' class='modal fade in'> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div id='myModalContent'></div> 
     </div> 
    </div> 
</div> 

@section scripts{ 

@Scripts.Render("~/bundles/jqueryval") 
<script src="~/Scripts/skillmanagementgrid.js"></script> 
} 

Я определил следующую модель: -

public class PagedList<T> 
    { 
     public List<T> Content { get; set; } 

     public Int32 CurrentPage { get; set; } 
     public Int32 PageSize { get; set; } 
     public int TotalRecords { get; set; } 
     public bool OnlyActive { get; set; } 
     public int TotalPages 
     { 
      get { return (int)Math.Ceiling((decimal)TotalRecords/PageSize); } 
     } 
    } 
} 

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

Html.DisplayNameFor(model => model.Content.FirstOrDefault().LastName) 

так может кто-нибудь может подумать, какие подходы я могу использовать для прямого доступа к элементам модели без вызова FirstOrDefault?

второй вопрос. в верхней части моей точки зрения я должен упомянуто полное название проекта следующим образом: -

@model SkillManagement.Models.PagedList<SkillManagement.Models.Staff> 

, но мой вопрос, как я могу просто объявить модель следующим образом: -

@model `PagedList<SkillManagement.Models.Staff>` 

Благодарности

ответ

1

Невозможно получить доступ к свойствам объекта внутри списка <>, не указывая конкретный объект, который вы хотите из списка. Список может содержать более одного объекта и для доступа к любому объекту требуется указать индекс этого элемента. Однако, если вы храните только один элемент в списке, то я хотел бы предложить, чтобы изменить свой список, чтобы просто Т. Например,

public class PagedList<T> 
{ 
    public T Content { get; set; } 

    public Int32 CurrentPage { get; set; } 
    public Int32 PageSize { get; set; } 
    public int TotalRecords { get; set; } 
    public bool OnlyActive { get; set; } 
    public int TotalPages 
    { 
     get { return (int)Math.Ceiling((decimal)TotalRecords/PageSize); } 
    } 
} 

Для вашего второго вопроса, то используйте @using заявления. Например,

@using SkillManagement.Models 
@model PagedList<SkillManagement.Models.Staff> 

Надеюсь, это ответит на ваши вопросы.

+0

PagedList наверняка будет содержать более одного элемента, потому что он используется для отображения списка данных внутри сетки .... так что если я делаю вещь Html.DisplayNameFor (model => model.Content.FirstOrDefault () .LastName) звук действителен? –

+0

второй вопрос, я думаю, что есть способ даже удалить «@using SkillManagement.Models» из верхней части представления, но я не могу его запомнить. потому что на шаблоне defualt scaffolding вы можете упомянуть только что-то вроде IEnumerable