MVC3 Модель привязки pagedlist к ViewModel с пользовательским EditorTemplate и частичным представлением - PullRequest
3 голосов
/ 06 января 2012

Я пытаюсь создать постраничную таблицу результатов, которая содержится в частичном представлении.Он динамически обновляется с помощью AJAX-вызовов.

Я воспроизводлю это на нескольких страницах, где он работает отлично, однако на конкретной странице мне требуется, чтобы значения строк таблицы были связаны и возвращались с помощью ViewModel.

Для достижения этой цели я попытался использовать шаблон EditorTemplate для настраиваемого объекта, который я использую для коллекции PagedList.Проблема заключается в том, что шаблон редактора, который появляется в PartialView, не правильно именует коллекцию PagedList в основной модели представления.

Вероятно, проще, если я объясню с помощью кода.

Основной вид выглядит следующим образом:

@model RequestCreateViewModel
<Code>

<div id="gridContainer">
    @Html.Partial("_PagedCreateRequest")
    @Html.HiddenFor(x => x.PageSize)
    @Html.HiddenFor(x => x.PageNumber)
</div>
<div id="loadingContainer">
</div> 

<More code>

Таким образом, Частичным является:

@model IPagedList<CreateRequestModel>
<Code>

<table class="tablesorter"  style="width:750px;">
                <thead>
                    <tr>
</tr>
                </thead>
                <tbody>
                    @Html.EditorFor(x => Model)
                </tbody>
            </table>
        </div>

<div style="float:left">
            @Ajax.ImageActionLink(
                "../../Content/images/first.gif",
                "alt text",
                "PageResults",
                new
                {
                    Page = 1,
                    area = "Admin",
                    SortBy = Model.SortBy,
                    SortDescending = Model.SortDescending,
                    PageSize = Model.PageSize
                },
                new
                {
                    style = "margin-top: 2px;"
                },
                new
                {
                    @readonly = "readonly"
                },
                new AjaxOptions
                {
                    UpdateTargetId = "gridContainer"
                }

                    )
        </div>

+ other pager Ajax pager icons and stuff

Шаблон EditorTemplate:

@model CreateRequestModel

<tr>
    <td>
        @Html.CheckBoxFor(x => x.IsSelected)
    </td>
    <td>
        @Html.DisplayFor(x => x.CompanyName)
        @Html.HiddenFor(x => x.CompanyName)
    </td>
    <td>
        @Html.DisplayFor(x => x.CompanyISIN)
        @Html.HiddenFor(x => x.CompanyISIN)
    </td>
    <td>
        @Html.DisplayFor(x => x.ShareDesc)
        @Html.HiddenFor(x => x.ShareDesc)
    </td>
    <td>
        @Html.DisplayFor(x => x.ShareClass)
        @Html.HiddenFor(x => x.ShareClass)
    </td>
</tr>

Модель представления:

public class RequestCreateViewModel : ViewModelBase
{
    public IPagedList<CreateRequestModel> PagedList { get; set; }

CreateRequestModel:

public class CreateRequestModel
{
    public int RequestId { get; set; }

    public bool IsSelected { get; set; }

    public string CompanyName { get; set; }
    public string CompanyISIN { get; set; }
    public string ShareDesc { get; set; }
    public string ShareClass { get; set; }
}

Но при повторной публикации в контроллер (код):

 [Authorize(Roles = "Foo")]
 [HttpPost]
 public ActionResult RequestCreate(RequestCreateViewModel model)

Свойство IPagedList не привязано к ViewModel (очевидно), поскольку стандарты именованияEditorTemplate имеют значение

, например: [0]. Независимо от

вместо:

PagedList [0]. Независимо от

Я не могу создать экземпляр связанной копииИнтерфейс для IPagedList во ViewModel либо.Итак, как мне получить информацию из основного представления для модели?

Я думаю, что решение может быть связано с пользовательским механизмом связывания моделей, но мой опыт в этой области минимален.Конечной целью этого является определение значения флажков в таблице.Пользователь выберет или нет, и мне нужно знать, что они выбрали!

Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 06 января 2012

Посмотрите на этот пост: http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

Секрет заключается в том, чтобы сгенерировать имя элемента управления в качестве имени коллекции с индексатором в виде

<input id="Products_0__ID" name="Products[0].ID" type="text" value="1" />
...