2015-05-09 36 views
0

我有一個視圖,它創建一個主對象(作者)和其他對象(書籍)的列表。所以創建的對象可以通過調用author.Books.ToList()來返回書籍。ASP - EF 6只綁定複雜列表的某些屬性?

我的問題是,我只希望用戶能夠設置書(名稱,日期等)的某些屬性。我不希望他們能夠使用javascript注入表單並設置書的價格。

我怎麼告訴我要綁定author.Books框架[全部]請將.Name(和日期),但要放棄author.Books [全部]。價格? 我知道我可以在控制器中手動測試它,但我覺得有一個更好的解決方案,我不能完全把它放在手指上。

上下文的某些代碼: 從視角的輸入框:

<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

這正是我們需要的使用的ViewModels,

您可以在視圖模型

剛剛成立
[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; 
} 

你可以閱讀更多有關的ViewModels以及如何使用它們 herehere

+0

非常好的問題,我完全忽略了這一點,說明我還沒有成長起來。謝謝你的準確答案。 –