ASP - EF 6只绑定复杂列表的某些属性?

时间:2015-05-09 13:57:55

标签: asp.net-mvc-5 entity-framework-6

我有一个视图,它创建一个主要对象(作者)和一个其他对象的列表(书籍)。因此,创建的对象可以通过调用author.Books.ToList()来返回书籍。

我的问题是我只希望用户能够设置书籍的某些属性(姓名,日期等)。我不希望他们能够使用javascript注入表单并设置书的价格。

如何告诉框架我想绑定author.Books [all] .Name(和date),但是想要丢弃author.Books [all] .Price? 我知道我可以在控制器中手动测试它,但我觉得有一个更好的解决方案,我只是不能完全把手指放在它上面。

上下文的一些代码: 来自View的输入框:

<input data-val="true" data-val-required="The CanBeBorrowed field is required." id="books_0__CanBeBorrowed" name="books[0].CanBeBorrowed" type="checkbox" value="true"`>

您可以看到添加额外输入字段会如何破坏数据。 控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Name,Date,Books")]Author author {...}

(在我的项目中,我有不同的类具有相同的结构。这就是为什么在创建作者时创建所有书籍看起来很愚蠢。)

1 个答案:

答案 0 :(得分:1)

这正是我们需要使用ViewModels的原因,

您只需在ViewModel中设置

即可
[Editable(false)]
public decimal Price { get; set; }

以及

[HttpPost]
[ValidateAntiForgeryToken]
    public ActionResult Create([AuthorViewModel authorVm)
{
      var author = _repository.getById(authorVm.Id);
      //update only the fields of author object that user is allowed to   update.
      author.Name = authorVm.Name;
      author.Date = authorVm.Date;
}

您可以阅读有关ViewModel以及如何使用它们的更多信息 herehere