【问题标题】:MVC3 Model binding pagedlist to ViewModel with custom EditorTemplate and Partial View使用自定义 EditorTemplate 和部分视图将 MVC3 模型绑定到 ViewModel 的分页列表
【发布时间】:2012-01-06 22:34:57
【问题描述】:

我正在尝试生成包含在部分视图中的分页结果表。它通过 ajax 调用动态刷新。

我在许多页面上都可以完美地复制它,但是在特定页面上我需要绑定表行的值并与 ViewModel 一起返回。

为了实现这一点,我尝试将 EditorTemplate 用于我用于 PagedList 集合的自定义对象。问题在于出现在 PartialView 上的编辑器模板没有为主 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].随便

我也无法在 ViewModel 中为 IPagedList 实例化接口的绑定副本。那么我该如何将主视图中的信息返回给模型呢?

我认为自定义模型绑定器可能是解决方案,但我在这方面的经验很少。这样做的最终目的是确定表格上复选框的值。用户会选择与否,我需要知道他们选择了什么!

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    看看这个帖子:http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

    秘诀是在控件上生成Name作为集合名,索引器为

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

    【讨论】:

    • 如果我想手动完成并命名所有内容,是的,我想这会起作用。帮助器和模板的重点当然是自动生成绑定的命名约定。我提到自定义模型绑定器的原因之一是我可以在没有前缀的情况下进行绑定:在这种情况下,“产品”......必须有比手动输入每个属性的字段更好的方法! =/
    • 您总是可以编写自己的助手来处理创建正确的控件名称。
    • 这是一种可能性,你有什么例子或建议我真的不知道从哪里开始。我写了很多自定义助手,但我不知道命名标准是如何生成的......
    • 在考虑了一会儿之后,肯定这里必须使用更实际的结构,也许我的结构错误?我当然不能被要求为我在下部编辑器模板上需要的每种输入类型创建一个自定义帮助器......这没有意义,而且看起来也不是一个晦涩难懂的场景。我是否做错了什么或错过了应用绑定的命名约定的东西?
    • Phil Haack,MVC 的“父亲”在他的博客上发布了关于模型绑定到列表的内容。自定义名称生成似乎是首选方式。 haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多