ASP.NET MVC - ExpressionHelper.GetExpressionText:返回错误的属性名称

时间:2012-11-24 16:26:06

标签: c# asp.net asp.net-mvc expression mvccontrib

我的视图使用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]请将.Name 即可。

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

0 个答案:

没有答案