在我目前编写的ASP.Net MVC 5应用程序中,一个
以下是我的模型的相关部分:
现在,如果
Material
可以有多个名称(MaterialName
)。我已经构建了一个Web界面,在材料的Edit
和Create
页面上添加、编辑和删除这些名称。为了实现这一点,我在这些页面上有多个名为Material.MaterialNames
的text
-input
。这些可以通过javascript在客户端添加和删除来改变名称的数量。我不需要在input
的name
中使用索引,因为用户应该看到和编辑的数据只是一个平面字符串列表。以下是我的模型的相关部分:
public class MaterialVM
{
public Material Material { get; set; }
// ...
}
public class Material
{
public int Id { get; set; }
public List<MaterialName> MaterialNames { get; set; }
// ...
}
public class MaterialName
{
public int Id { get; set; }
public string Name { get; set; }
public int MaterialId { get; set; }
}
现在,如果
Material.MaterialNames
是List<string>
类型,一切都会很好。但在我的情况下,模型绑定器无法从作为表单数据传递的多个字符串值中创建MaterialName
。我认为修复这个问题的默认方法是编写自定义模型绑定器。像这个答案中那样(=覆盖BindProperty
并仅更改一个PropertyType的行为),这样做是否明智?我将与全局注册该绑定器用于类型MaterialVM
。是否有更简单的选择?难道不能仅提供默认绑定器一个将简单类型转换为复杂类型的方法吗?我的自定义模型绑定器编写方法正确吗?是否还有其他选项我错过了,可以使这更直观?
MaterialName
。这就引出了一个问题:绑定器支持的非复杂类型是否是硬编码的?绑定器是否使用任何标准反序列化方法,以便我可以在那个点添加转换逻辑? - Georg JungList<MaterialName>
改为List<string>
。但是,如果用户更改了一个项目的值,并且你只比较字符串值,你将不知道该项目是新项目还是现有项目(因为数据库中不存在该名称)。 - user3559349