MVC3 Model liant la liste paginée à ViewModel avec EditorTemplate et une vue partielle personnalisés

J’essaie de produire un tableau de résultats paginé, contenu dans une vue partielle. Il est actualisé dynamicment avec les appels ajax.

En reproduisant ceci sur un certain nombre de pages où cela fonctionne parfaitement, cependant, sur une page particulière, il faut que les valeurs des lignes du tableau soient liées et renvoyées avec ViewModel.

Pour ce faire, j’ai essayé d’utiliser un EditorTemplate pour l’object personnalisé im utilisant pour la collection PagedList. Le problème réside dans le fait que le modèle d’édition qui apparaît sur le PartialView ne se nomme pas correctement pour la collection PagedList sur le ViewModel principal.

C’est probablement plus facile si j’explique avec du code.

La vue principale apparaît ainsi:

@model RequestCreateViewModel  
@Html.Partial("_PagedCreateRequest") @Html.HiddenFor(x => x.PageSize) @Html.HiddenFor(x => x.PageNumber)

La Partielle est donc:

 @model IPagedList   @Html.EditorFor(x => Model) 
@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" } )
+ other pager Ajax pager icons and stuff

Le EditorTemplate est:

 @model CreateRequestModel   @Html.CheckBoxFor(x => x.IsSelected)   @Html.DisplayFor(x => x.CompanyName) @Html.HiddenFor(x => x.CompanyName)   @Html.DisplayFor(x => x.CompanyISIN) @Html.HiddenFor(x => x.CompanyISIN)   @Html.DisplayFor(x => x.ShareDesc) @Html.HiddenFor(x => x.ShareDesc)   @Html.DisplayFor(x => x.ShareClass) @Html.HiddenFor(x => x.ShareClass)   

Le ViewModel est:

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

CreateRequestModel est:

 public class CreateRequestModel { public int RequestId { get; set; } public bool IsSelected { get; set; } public ssortingng CompanyName { get; set; } public ssortingng CompanyISIN { get; set; } public ssortingng ShareDesc { get; set; } public ssortingng ShareClass { get; set; } } 

Mais une fois renvoyé au contrôleur (code):

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

La propriété IPagedList n’est pas liée au ViewModel (évidemment) car les normes de nommage de EditorTemplate sont

par exemple: [0].

plutôt que:

PagedList [0] .Quel soit

Je ne peux pas instancier une copie liée de l’interface pour un IPagedList dans le ViewModel non plus. Alors, comment puis-je obtenir les informations de la vue principale vers le modèle?

Je pense qu’un classeur de modèle personnalisé pourrait être la solution, mais mon expérience est minimale dans ce domaine. Le but final de ceci est de déterminer la valeur des cases à cocher sur la table. L’utilisateur sélectionnera ou non et j’ai besoin de savoir ce qu’ils ont sélectionné!

Un grand merci pour toute aide.

Jetez un coup d’œil à cet article: http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

Le secret consiste à générer le nom sur le contrôle en tant que nom de collection avec un indexeur en tant que