ASP.Net MVC - 如何包含/排除某些子集合/可枚举属性的绑定?

时间:2015-05-18 15:27:26

标签: asp.net .net asp.net-mvc binding

详细说明:

  • ASP.Net MVC 5
  • .Net 4.5
  • MVVM
  • 实体框架6代码优先

我有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属性语句?

1 个答案:

答案 0 :(得分:0)

我不能肯定地说,因为我从不使用Bind属性,但点语法应该工作。但是,我有理由相信Bind侧重于发布的名称,而不是实际的模型属性。换句话说,您很可能需要执行"Positions[0].StartDate,Positions[1].StartDate,..."之类的操作。

一般来说,仅使用视图模型仅包含您想要编辑的属性会更好。