MVC3使用自定义EditorTemplate和Partial View将Viewdlist绑定到ViewModel

时间:2012-01-06 14:21:55

标签: c# asp.net-mvc-3 model-binding

我正在尝试生成包含在“部分”视图中的分页结果表。它使用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可能是解决方案,但我在这方面的经验很少。最终目的是确定表格上复选框的值。用户将选择与否,我需要知道他们选择了什么!

非常感谢您的帮助。

1 个答案:

答案 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" />