我正在尝试生成包含在“部分”视图中的分页结果表。它使用ajax调用动态刷新。
我在很多可以正常工作的页面上重现这一点,但是在特定的页面上,我需要绑定表行的值并使用ViewModel返回。
为了达到这个目的,我尝试将EditTemplate用于为PagedList集合使用的自定义对象。问题在于PartialView上显示的editortemplate没有为主ViewModel上的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>
ViewModel是:
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] .Whatever
我无法在ViewModel中为IPagedList实例化接口的绑定副本。那么我如何将主视图中的信息传回模型呢?
我认为自定义Model Binder可能是解决方案,但我在这方面的经验很少。最终目的是确定表格上复选框的值。用户将选择与否,我需要知道他们选择了什么!
非常感谢您的帮助。
答案 0 :(得分:0)
看一下这篇文章: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" />