2010-11-17 88 views
4

嘿大家,我正在玩ASP.NET MVC和實體框架。我想知道什麼是處理從控制器到視圖然後回傳數據的最佳方法。我會解釋更好一點:ASP.NET MVC通過傳遞數據

我有一個動作是創建一個新的「收據」對象

 [Authorize] 
    public ActionResult CreateReceipt(int id) 
    { 
      //I create the receipt object 
      Receipt newReceipt = new Receipt(); 
      // assign some information about the owner of the receipt 
      // and the group that it belongs to 
      newReceipt.Group = group; 
      newReceipt.Owner = user; 
      //send off to the view to be displayed 
      return View(newReceipt); 
    } 

所以我基本上是創建一個收據,並在一些信息預先填寫(包括授權用戶和一些組ID信息),然後我可以發送到一個視圖與各種表單元素,讓用戶填寫其他缺失的領域,並提交,以便添加一個新的收據。如果收據對象中的所有字段都顯示在表單上,​​這一切都很好。

如果我刪除用戶不應觸及的事物的表單元素(例如組號碼,收據所屬的用戶ID等)然後,當我提交表單並選擇它時在控制器中:

 [HttpPost] 
    [Authorize] 
    public ActionResult CreateReceipt(Receipt receipt) 
    { 

     if (ModelState.IsValid) 
     { 
      using (EntityFrameworkEntities context = new EntityFrameworkEntities) 
      { 
       context.AddToReceipts(receipt); 
       context.SaveChanges(); 
      } 
      return RedirectToAction("Index"); 
     } 

     return View(receipt); 
    } 

然後,我填寫併發送到視圖的所有方便的預加載信息都不會返回到帖子中。我知道我可以將UserID或GroupID置於隱藏字段中,然後使用POST將其返回,但感覺不對。從技術上講,有人可以進入,改變隱藏的價值並重新提交帖子。然後,我可以檢查以確保所有內容都應該屬於它的位置,但這也感覺像是另一次訪問數據庫以獲取我已經擁有的信息。

如果有人能詳細闡述一下從模型到控制器傳遞數據的標準方式,那就太好了。感謝您的時間和幫助!

回答

5

如果您擔心有人用隱藏字段值竄改以影響其他記錄,請填寫ID值並在隱藏字段中加密,然後在回發時解密。

+1

+1,這是主要答案,我在答案中增加了一些更直接的幫助 – 2010-11-17 20:58:22

+0

這似乎是一個很好的解決方案,真正防止篡改和所有,我更要求,因爲它看起來像我應該我不需要用隱藏的字段清理我的表格,但不知怎的,我保留了發送到視圖的值,以便往返旅行。我可能是錯的,但我想這就是發佈這個問題的重點:-)我肯定會考慮這樣做。謝謝你的信息! – 2010-11-17 21:13:31

+0

如果你想擺脫頁面中的id字段,你仍然需要設計一些其他方式將id傳遞給客戶端,以便在回發時傳遞它。沒辦法。 – 2010-11-17 21:15:51

3

我剛剛在我現有的一個應用程序中添加了這樣的功能。這將在從@戴夫Swersky

答案擴大假設

Receipt 
ID 
Cost 
ShippingAddress 

業務對象我想有一個視圖模型

ReceiptViewModel 
ID 
Cost 
CostHash 
ShippingAddress 

你的觀點會碰到這樣的

Html.HiddenFor(m => m.Id) 
Html.HiddenFor(m => m.CostHash) 
Html.LabelFor(m => m.Cost) 
Html.LabelFor(m => m.ShippingAddress) 

然後,爲了將業務對象映射到視圖模型,除了t他需要CostHash計算Cost + Private Key +可預測的Salt值(例如收據本身的ID)的Sha256散列(或其他散列)。你想包含對象的ID或其他變量但已知值的原因是,系統的用戶不能繞過你的散列。

如果只使用原始值+私鑰,如果成本爲10美元,則每次輸出爲10美元。這可以讓一個人很容易轉換不同收據的Cost值和CostHash值,但是如果您將ID添加爲salt的一部分,收據1的$ 10的哈希將不同於收據2的$ 10。如果您在同一個對象上有很多類似的值可以保護您仍然擔心用戶可以使用Cost和CostHash值並將它們移動到不同的行項目中,那麼您需要向salt中添加更多內容,例如屬性名稱物品等

當視圖模型發送回控制器時,您要計算Cost的期望散列並將其與CostHash屬性進行比較,並驗證它們是否相等。如果它們不同意味着企圖篡改。