2012-02-14 72 views
0

我有以下操作方法: -如何在asp.net MVC3綁定列表添加到TryUpdateModel

[HttpPost] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     Assessment a = elearningrepository.GetAssessment(id); 

     try 
     { 
      if (TryUpdateModel(a)) 
      { 
       elearningrepository.Save(); 
       return RedirectToAction("Details", new { id = a.AssessmentID }); 
      } 
     } 
//code does here 

,但我不能寫類似if (TryUpdateModel(a, "Assessment", new string { "Date"}))指定我只允許日期屬性被更新。 那麼我如何在上面添加綁定列表if (TryUpdateModel(a))

BR

回答

0

,但我不能寫類似

if (TryUpdateModel(a, "Assessment", new string { "Date"}))

那是因爲你應該寫這樣的,因爲允許的性能參數表示的字符串數組:

if (TryUpdateModel(a, "Assessment", new[] { "Date" })) 
{ 

} 
+0

謝謝你的答覆,但使用我們的代碼更新永遠不會執行,即使我嘗試更新日期字段它不會被保存,舊值仍然會在那裏。請注意,編輯視圖中的其他字段是禁用的,因此它們不應該是模型綁定的一部分 – 2012-02-15 00:02:36

0

我窩建議您遠離使用TryUpdateModel。

存儲庫通常有一個更新方法,該方法在調用Save()之前將entityState設置爲已修改,我在上面的代碼中看不到該方法。

如果你的目標是顯示一個記錄,並只允許保存日期,則創建該模型的視圖,並渲染領域:

這將設置視圖的模型:

@model YourNamespace.Models.Assessment 

@Html.DisplayFor(model=>model.propertyToDisplay)

你只是想顯示的項目,以及

@Html.EditorFor(model=>model.Date) 

在你的動作控制器,你把你要綁定到作爲輸入參數屬性:

編輯

class Assessment 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    //Other properties 
} 

public ActionResult Edit(int Id, DateTime Date) 
{ 
    var assessment = elearningrepository.GetAssessment(id); 

    assessment.Date = Date; 

    elearningrepository.UpdateAssessment(assessment); 
    elearningrepository.Save(); 

    //Redirect to action Detail 
} 

在這種情況下,模型綁定應該只是綁定到身份證,和日期,因此,即使如果有人試圖發佈其他值(編輯html表單很簡單),ActionResult中的參數應該與Model中的完全相同,並用它來獲取和更新實體。

您應該驗證用戶實際上是否可以訪問和編輯該ID,或者作爲替代使用MVC Security Codeplex來檢查Id參數是否未被篡改。使用起來非常簡單方便,但這是另一個討論。

正如你可以使用這樣的屬性,this blog描述的選擇,但我不使用自己:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Include="Id,Date")] Assessment assessment) 
+0

好的感謝您的回覆,但作爲MVC Web應用程序安全性的一部分,我應該避免發佈線程;那爲什麼我需要使用[bind]指定一個白名單。我需要這種方法遍佈我的應用程序,而不僅僅是針對這個特定的情況。任何建議... – 2012-02-15 03:14:41

+0

我編輯帖子相當多。在建議的解決方案中,只有從視圖中需要的屬性被綁定。如果你真的不想發佈除你需要的值之外的任何東西,你只需要在@using Html.BeginForm(它創建表單標籤)中發佈你想發佈的內容 - 在這種情況下只有Date和Id,或者你需要使用jQuery.post或Javascript發佈到操作方法。 – cfs 2012-02-15 08:24:29

+0

感謝您的編輯,但這種方法不會很好地擴展我自己,因爲在其他senarios我可能需要白名單,包括不僅僅是單一的日期字段。 BR – 2012-02-15 14:29:03

0

我想這一個正常工作

string[] allowedProperties = new[] { "Date" }; 
      try 
      { 
       if (TryUpdateModel(a, allowedProperties)) 
       { 
相關問題