详细说明:
我有ViewModels,它们具有复杂的属性。我已经了解了如何使用BindAttribute来包含或排除模型出价的属性,并获得了基本属性。
但是我找不到的一件事是如何控制集合属性中子属性的绑定。例如,我有以下
[Bind(Include = "Model.Id, Model.Positions.StartDate")]
public class ProjectViewModel
{
public Project Model {get;set;}
public ProjectViewModel(Project project)
: base(project)
{
Model = project;
}
public ProjectViewModel()
{
}
}
项目有一个职位列表:
public class Project : BaseEntity
{
.
.
.
public virtual IList<Position> Positions
{
get;
set;
}
}
并且职位有开始和结束日期:
public class Position : BaseEntity
{
[SensibleDateTime]
public DateTime StartDate { get; set; }
[SensibleDateTime]
public DateTime EndDate { get; set; }
[Required]
[ForeignKey("Project")]
public Int64 ProjectID { get; set; }
public virtual Project Project { get; set; }
}
我有一个使用项目视图模型的屏幕,其中包含一个位置网格,允许用户更改这些位置的开始和结束日期。我不想让他们让他们修改职位的任何其他属性,包括操纵请求/发布到服务器。
我正在编写自己的自定义模型绑定器,它继承自DefaultModelBinder,它将原始实体从数据库中取出。我只想在顶部绑定允许的绑定字段以获取这些新值,并且所有原始值都已存在。
我知道我可以将原始实体从控制器内部的数据库中取出,然后手动将绑定的开始和结束日期映射到实体上。我希望尽可能避免这种情况,并使控制器代码尽可能简单,因为这将是一项非常常见的任务。此外,似乎使用标准MVC机制将是首选方法。
我在项目视图模型上尝试了以下绑定语句:
[Bind(Include = "Model.Positions.StartDate")]
没有绑定任何新值,包括头寸的开始日期。如果我直接在项目视图模型或模型上为属性编写一个简单的包含它。
如何编写引用实体集合中属性的Bind属性语句?
答案 0 :(得分:0)
我不能肯定地说,因为我从不使用Bind
属性,但点语法应该工作。但是,我有理由相信Bind
侧重于发布的名称,而不是实际的模型属性。换句话说,您很可能需要执行"Positions[0].StartDate,Positions[1].StartDate,..."
之类的操作。
一般来说,仅使用视图模型仅包含您想要编辑的属性会更好。