首先,请耐心等待。我有一个自定义模型绑定器,它成功地将表单数据映射到自定义对象。在此模型绑定器中,它还将表单项映射到不同的自定义对象。我觉得我应该做的是创建一个单独的模型绑定器来处理第二个映射。这是一个简化版本。
自定义对象:
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>
编写一个自定义来映射类别显然很简单,编写模型绑定器然后映射SubCategory(在模型绑定器中我将运行查询我的数据存储库)证明有点困难。
我不确定我有多清楚,道歉,感谢阅读,如果有什么我可以说的话让我更清楚,请告诉我!
答案 0 :(得分:5)
我对此的看法是模型绑定器应该构建表示模型,而不是存储库中的实体类型。模型绑定器应该是从表单的键/值集合到表示模型的非常简单的映射,该表示模型主要是标量值,可能与其他类型(通常是标量值或列表)有某种关系。必须从存储库中实现实体实例会增加很多复杂性,正如您所发现的那样。
而且,这是不必要的。使用表示模型具有许多优点,包括:
因此,在您的示例中,子类别将从表单集合作为整数列表进入。因此,表示模型应该具有相同的整数列表。在控制器中,绑定后,您可以调用方法将模型值从表示模型传输到存储库中的物化类别实例。
答案 1 :(得分:1)
我建议你看看这个Singing Eels post,它提供了另一种方法的例子。使用示例StatefulObjectBinder方法,可以绑定必须从数据库中检索的业务对象集合。由于控制器正在实现IModelBinder,因此您可以访问存储库,该存储库可用于水合所需的对象并将它们添加到对象集合中。