我有一个视图,它创建一个主要对象(作者)和一个其他对象的列表(书籍)。因此,创建的对象可以通过调用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 {...}
(在我的项目中,我有不同的类具有相同的结构。这就是为什么在创建作者时创建所有书籍看起来很愚蠢。)
答案 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;
}