0

首先,请容忍我在这里。我有一个自定义模型绑定器,它成功地将表单数据映射到自定义对象。在此模型绑定器中,它还将表单项映射到不同的自定义对象。我觉得我应该能够做的是创建一个单独的模型绑定器来处理第二个映射。这是一个简化版本。

自定义对象:

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Status { get; set; }
}

如果我的表单为 SubCategories 传回了一堆 Id,我需要做的是运行到数据存储库并水合 SubCategory 对象。从表格中,将按以下格式提交子类别列表:

<input type="text" name="Name" value="This Category" />

<input type="hidden" name="subcat.Index" value="0" />
<select name="subcat[0].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="1" />
<select name="subcat[1].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="2" />
<select name="subcat[2].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

编写自定义来映射类别显然很简单,但编写模型绑定器将依次映射子类别(在模型绑定器中,我会运行查询我的数据存储库)证明有点困难。

我不确定我说得有多清楚,抱歉,感谢您的阅读,如果有什么我可以说的让我更清楚,请告诉我!

4

2 回答 2

5

我对此的看法是模型绑定器应该构建表示模型,而不是来自存储库的实体类型。模型绑定器应该是从表单的键/值集合到表示模型的非常简单的映射,该表示模型主要是标量值,可能与其他主要是标量值或列表的类型有一些关系。正如您所发现的,必须从存储库中实现实体实例会增加很多复杂性。

而且,这是不必要的。使用演示模型有很多优点,包括:

  • 永远不需要将允许用户更新的字段列入白名单,因为表示模型只包含这些字段。
  • 默认模型绑定器适用于除最复杂的模型绑定场景之外的所有场景。在实践中,我发现只有当用户看到的值必须以有条件的方式绑定到某个其他值时,我才需要使用自定义模型绑定器。使用表示模型时,表示模型的结构应该与页面的结构相匹配,因此出于结构原因,您不需要使用自定义模型绑定器。
  • 您将能够在创建数据库或实体模型之前创建视图和控制器。这意味着您可以在进行大量工作以创建最终系统之前获得客户对您的设计的认可。这有助于在实体模型中的结构性问题发生之前对其进行梳理。只需创建一个与您认为客户希望看到的页面相匹配的演示模型,使用此演示模型的虚构实例构建页面的总体轮廓,并将其展示给客户。如果他们满意,您可以构建存储库/实体模型并编写 LINQ 查询以将其映射到您的表示模型。

因此,在您的示例中,子类别将作为整数列表来自表单集合。因此,表示模型应该具有相同的整数列表。在控制器中,绑定后,您可以调用方法将模型值从表示模型传输到存储库中的物化类别实例。

于 2009-04-02T12:05:42.467 回答
1

我建议看一下这个Singing Eels 帖子,它提供了另一种方法的示例。使用示例 StatefulObjectBinder 方法,可以绑定必须从数据库中检索的业务对象集合。由于控制器正在实现 IModelBinder,因此您可以访问存储库,该存储库可用于混合所需的对象并将它们添加到对象集合中。

于 2009-04-13T15:55:24.163 回答