2009-10-03 54 views

回答

0

我對這個問題有點不清楚,所以糾正我,如果我錯了。我假設你正在談論你傳遞給視圖的模型以及表單發佈後返回的模型。

不,他們不一定是相同的,但你可能會有相當多的重疊。進入視圖的模型應包含Post所需的所有字段,如果存在驗證錯誤,您需要將數據發回。

我的模型是相同的,原因是我使用的模型通常只包含與窗體上的元素相對應的屬性。如果我需要額外的數據,也許是一個頁面標題,我通常會直接添加到ViewData。

如果您在模型類上有其他屬性,並且您在Post上使用自動綁定,那麼如果有人在傳輸中修改了Post請求並添加了與模型中未使用的屬性相對應的額外數據,自動綁定程序會綁定那些在最糟糕的情況下可能用於類似SQL注入攻擊的數據(最好的情況是您的應用程序處於未知狀態)。所以我的建議是不要這樣做。如果你絕對必須假設你有一些基於頁面上的其他元素顯示和隱藏的字段,請使用手動綁定,並且不要綁定不應包含數據的字段。

+0

還有另一種可能性,([裝訂(排除=「字段「)] ViewModel data) – queen3 2009-10-03 10:46:39

+0

嗯,那麼我可以將它綁定到我的模型,排除一些字段,並根據需要從請求中拉出那些被排除的字段...並將我的對象準備好轉儲到數據庫中。 – BigOmega 2009-10-03 22:06:47

0

當然,您可以在控制器的參數中使用不同的類,而不是您發送給視圖的類,這通常會非常有用。例如,我經常有一些表單將一個父實體傳遞給該視圖,但該視圖將一個包含將成爲一個子實體的新實例的東西的表單發回。您也可以處理來自客戶端的其他字段。

模型結合具有與從試圖排除在釘裝類屬性處理從結合

這裏加載屬性是一個例子:

public ActionResult AddComment( 
    [Bind(Exclude = "commentId"] Comment userComment, bool notifyUser 
) 
{ 

    // do stuff to add comment to the DB 
    // notifyUser is a checkbox passed from client, but isn't stored in DB   

    // now return the comment view to the client but that view needs the entire thread 

    var model = GetThread(); 
    return View("Comment", model); 
}