Как получить прямой доступ к элементам внутри моего WebGrid

У меня есть следующая веб-сетка asp.net в моем представлении бритвы: -

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

Спасибо


person john Gu    schedule 22.01.2015    source источник


Ответы (1)


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

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>

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

person Kiran Varsani    schedule 22.01.2015
comment
PagedList наверняка будет содержать более одного элемента, потому что он используется для отображения списка данных внутри сетки.... поэтому, если я делаю так, Html.DisplayNameFor(model => model.Content.FirstOrDefault().LastName ) звучит достоверно? - person john Gu; 22.01.2015
comment
второй вопрос, я думаю, что есть способ даже удалить @using SkillManagement.Models из верхней части представления, но я не могу этого вспомнить. потому что в шаблоне шаблона по умолчанию вы можете упомянуть только что-то вроде IEnumerable‹Applicationname.Models.TestModel› - person john Gu; 22.01.2015