2014-01-21 28 views
21
  • VS2012,.NET 4.51

我有一個包含一個使用模型綁定一個ListView的用戶控件。到現在爲止還挺好。我想根據用戶如何操作視圖模式來顯示對象列表。爲此我有一個名爲Roles的公共財產。然而,當我打電話TryUpdateModel()從內側那裏,我收到異常:如何調用TryUpdateModel一個數據操作方法外

TryUpdateModel」必須傳送一個值提供商或可替代地,必須 可以從使用 模型結合的控制的數據的操作方法中調用數據綁定

現在,雖然我知道我可以做退出編輯模式:

lvData.EditIndex = -1; 

,然後在UpdateMethod電話TryUpdateModel(),我想知道如何撥打TryUpdateModel,而無需連接方法進行更新。換句話說,我提供IValueProvider參數到TryUpdateModel()的方式/位置/提供什麼。

/// <summary> 
///  Initialise the user control 
/// </summary> 
/// <param name="aRoles">List of roles to display</param> 
public void Activate(List<RoleInfo> aRoles) 
{ 
    //List we will be binding 
    _ViewModel = new List<MembershipRolesViewModel>(); 

    //Transfer the supplied list into the view model 
    foreach (RoleInfo roleInfo in aRoles) 
    { 
     _ViewModel.Add(new MembershipRolesViewModel 
     { 
      RoleDisplayName = roleInfo.RoleDisplayName, 
      RoleHint = roleInfo.RoleHint, 
      RoleName = roleInfo.RoleName, 
      RoleSelected = roleInfo.RoleSelected 
     }); 
    } 
} 

//ListView.SelectMethod points here 
public IQueryable<MembershipRolesViewModel> RolesSelect() 
{ 
    return _ViewModel.AsQueryable(); 
} 

//Property to return the roles as manipulated by the user 
public List<RoleInfo> Roles 
{ 
    get 
    { 
     List<RoleInfo> result = new List<RoleInfo>(); 
     TryUpdateModel(_ViewModel); 

     foreach (MembershipRolesViewModel membershipRolesViewModel in _ViewModel) 
     { 
      result.Add(new RoleInfo 
      { 
       RoleDisplayName = membershipRolesViewModel.RoleDisplayName, 
       RoleHint = membershipRolesViewModel.RoleHint, 
       RoleName = membershipRolesViewModel.RoleName, 
       RoleSelected = membershipRolesViewModel.RoleSelected 
      }); 
     } 

     return result; 
    } 
} 

TryUpdateModel必須傳遞的值提供者或可選地必須從使用模型數據綁定結合的控制的一個數據操作方法內被調用。

+0

我嘗試過'TryUpdateModel(_viewModel,new FormValueProvider(Page.ModelBindingExecutionContext));'沒有成功。它運行,並且'FormValueProvider'正確地解析表單值......但是'TryUpdateModel'不會將它們複製到相應的viewModel屬性中。 – Merenzo

+0

我可以看到你只是填充ViewModel以便與視圖一起使用。沒有提及的操作方法或cshtml參考。 你試圖用TryUpdateModel()來實現什麼,因爲那只是對ModelBinder的顯式調用罷了。這裏看不到IValueProvider。 如果您正在尋找關於更新模型的更多信息,請參閱此: http://stackoverflow.com/questions/5268421/when-and-why-do-you-use-tryupdatemodel-in-asp-net-mvc- 2 – Vaibhav

+0

任何一個工作** WebForms **代碼的例子的機會? – TheEdge

回答

1

沒有簡單的方法從ListView項目獲取值。你必須在項目上循環並提取它們的值。

var bindableTemplate = lv.ItemTemplate as IBindableTemplate; 
foreach (ListViewItem item in lv.Items) 
{ 
    var dic = bindableTemplate.ExtractValues(item).Cast<System.Collections.DictionaryEntry>().ToDictionary(k => (string)k.Key, v => v.Value); 
    var provider = new DictionaryValueProvider<object>(dic, System.Globalization.CultureInfo.InvariantCulture); 

    // Now we can update the item. 
    TryUpdateModel<RoleInfo>(model, provider); 
} 

或強制ListView更新自己的項目。

public List<RoleInfo> Roles 
{ 
    get 
    { 
     List<RoleInfo> result = new List<RoleInfo>(); 
     for (int i = 0; i < lv.Items.Count; i++) 
      if (lv.Items[i].ItemType == ListViewItemType.DataItem) 
       lv.UpdateItem(i, true); 

     //... 

     return result; 
    } 
} 



public void lv_UpdateItem(int id) 
{ 
    RoleInfo model = //... 
    TryUpdateModel(model); 
} 

希望這會有所幫助。

0

在Action方法之外調用TryUpdateModel是錯誤的方法。 由於Model Binder與Action方法緊密結合,因此它們可以自動填充以使用我們在UI上填充的數據來模擬屬性。

所以,請嘗試TryUpdateModel內的一個操作方法,我希望能正常工作。

相關問題