2010-06-01 32 views
0

这个对我来说似乎很痛苦,但由于某种原因,我无法按照我希望的方式工作。也许这是不可能的,但这似乎不大可能。这个问题可能有点相关:ASP.NET MVC Model Binding Related Entities on Same PageASP.NET MVC - 绑定一个子实体到模型

我有一个EditorTemplate编辑具有多个相关实体引用的实体。当呈现编辑器时,用户被赋予下拉列表以从中选择相关实体,并且下拉列表返回ID作为其值。

<%=Html.DropDownListFor(m => m.Entity.ID, ...)%> 

当发送请求的形式值命名为预期:“Entity.ID”,但定义为动作参数我强类型的模型没有Entity.ID填充在传递的值请求。

public ActionResult AddEntity(EntityWithChildEntities entityWithChildEntities) { } 

我试图用bind()的属性摆弄周围并在entityWithChildEntities指定Bind(Include = "Entity.ID"),但似乎并没有工作。我也试过Bind(Include = "Entity"),但是导致ModelBinder试图绑定一个完整的“实体”定义(并不奇怪)。

有没有什么办法让默认的模型绑定,以填补子实体ID或我将需要添加动作参数为每个孩子实体的ID,然后将值手动复制到模型中定义?

+0

是否'实体'属性有任何访问修饰符,除'公共'?喜欢这个; '公民HomeTestModelChild儿童{get;内部设置; }' – cem 2010-06-02 13:09:12

+0

不,先生,这一切都是公开的。 – 2010-06-02 16:54:58

回答

1

你看过AutoMapper吗?我同意这不应该是必需的,因为绑定应该可以工作,但...

我使用Html.XYZFor帮助器时遇到了一些困难,并且已经恢复为使用MVC 1.1表示法,并且它都可以工作。

+0

我其实还没有检出AutoMapper。这是一段时间的工作。 – 2010-06-02 16:54:32

0

有没有DropDownListFor辅助方法,只需要一个参数。标准DropDownListFor方法需要至少两个参数:第一个是一个lambda用于计算选择的名称,第二个是IEnumerable<SelectListItem>

<%= Html.DropDownListFor(m => m.Entity.ID, Model.EntitiesList) %> 

另外如何的EntityWithChildEntities类型样子?它必须是这样的:

public class EntityType 
{ 
    public string ID { get; set; } 
} 

public class EntityWithChildEntities 
{ 
    public EntityType Entity { get; set; } 

    public IEnumerable<SelectListItem> EntitiesList 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "1", Text = "foo" }, 
       new SelectListItem { Value = "2", Text = "bar" }, 
      } 
     } 
    } 
} 
+0

我欣赏的答案,但并不意味着我的伪代码进行字面解释。从实施的角度来看,一切都是正确构建的问题是,尽管在表单发布中接收了正确命名的值,但模型的子实体没有被填充。换句话说,表单字段名称和值是正确的,但是模型输出不符合预期。 – 2010-06-02 06:37:02