2

私のビューは MVCContrib Grid を使用しており、その中にいくつかの入力フィールドが必要です。

@(Html.Grid(Model.Items)
.RenderUsing(new PostAsListRenderer<ItemModel>("list"))
.Columns(c =>
{
    c.Custom(
        @<text>
             @Html.HiddenFor(x => item.Id), item.Id)
             @item.Id
         </text>
    ).Named("Id");
    c.For(x => Html.TextBoxFor(y => x.Name)).Named("Name");
    c.For(x => Html.TextBoxFor(y => x.Description)).Named("Description");
    c.For(x => Html.DropDownListFor(y => x.SelectedItem, Model.SelectListItems)).Named("DropDown");
    c.For(x => Html.NameFor(y => x.Name));
}))

問題は、テキスト ボックスの name 属性が次のようになっていることです。

リスト [38ef6173-b837-4d5a-ab2a-28ba9989c879].Value.Name

それ以外の

リスト[38ef6173-b837-4d5a-ab2a-28ba9989c879] .名前。

list[38ef6173-b837-4d5a-ab2a-28ba9989c879]PostAsListRendererは、を使用するカスタム レンダラーによって作成されたプレフィックスですTemplateInfo.HtmlFieldPrefix

.Nameは、によって ASP.NET MVC 内で作成されますExpressionHelper.GetExpressionText

すべての入力フィールドで問題が発生します。

グリッド全体をサーバーに送信するには、正しい名前の値が必要です。

問題は、私が使用する表現の種類ですc.For(x => Html.TextBoxFor(y => x.Name))

ExpressionHelper.GetExpressionTextこれはメソッドのバグですか?

これで、複雑ではないプロパティに対してのみ機能する回避策があります。

@(Html.Grid(Model.Items)
.RenderUsing(new PostAsListRenderer<ItemModel>("list"))
.Columns(c =>
{
    c.Custom(
        @<text>
             @Html.Hidden(Reflector.GetPropertyName(x => item.Id), item.Id)
             @item.Id
         </text>
    ).Named("Id");
    c.For(x => Html.TextBox(Reflector.GetPropertyName(y => x.Name), x.Name)).Named("Name");
    c.For(x => Html.TextBox(Reflector.GetPropertyName(y => x.Description), x.Description)).Named("Description");
    c.For(x => Html.DropDownList(Reflector.GetPropertyName(y => x.SelectedItem), Model.SelectListItems)).Named("DropDown");
}))

正しい名前属性値を作成するより良い方法はありますか?

編集#1:

私の意見では、これはバグです。あなたもそう思うなら、http: //aspnetwebstack.codeplex.com/workitem/638で問題に投票してください。

編集#2: これらは私のビューモデルです:

public class ViewModel
{
    public List<ItemModel> Items { get; set; }
    public List<SelectListItem> SelectListItems { get; set; }
}

public class ItemModel
{
    public int Id { get; set; }
    public string SelectedItem { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

コードはhttps://github.com/Rookian/ListModelBindingでも入手できます。

4

0 に答える 0