2010-02-24 25 views
5

我正試圖遷移到ASP.Net MVC 2並滿足一些問題。 這裏是一個: 我需要直接綁定詞典作爲查看帖子的結果。MVC 2,IModelBinder&ValueProvider更改

在ASP.Net MVC 1,它的工作完全使用自定義IModelBinder

/// <summary> 
/// Bind Dictionary<int, int> 
/// 
/// convention : <elm name="modelName_key" value="value"></elm> 
/// </summary> 
public class DictionaryModelBinder : IModelBinder 
{ 
    #region IModelBinder Members 

    /// <summary> 
    /// Mandatory 
    /// </summary> 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     IDictionary<int, int> retour = new Dictionary<int, int>(); 

     // get the values 
     var values = bindingContext.ValueProvider; 
     // get the model name 
     string modelname = bindingContext.ModelName + '_'; 
     int skip = modelname.Length; 

     // loop on the keys 
     foreach(string keyStr in values.Keys) 
     { 
      // if an element has been identified 
      if(keyStr.StartsWith(modelname)) 
      { 
       // get that key 
       int key; 
       if(Int32.TryParse(keyStr.Substring(skip), out key)) 
       { 
        int value; 
        if(Int32.TryParse(values[keyStr].AttemptedValue, out value)) 
         retour.Add(key, value); 
       } 
      } 
     } 
     return retour; 
    } 

    #endregion 
} 

它的工作對與顯示的數據字典一些聰明HtmlBuilder。

我現在遇到的問題是,ValueProvider不是字典<>了,這是一個IValueProvider,只允許得到的值,它們的名字被稱爲

public interface IValueProvider 
{ 
    bool ContainsPrefix(string prefix); 
    ValueProviderResult GetValue(string key); 
} 

這實在是不冷靜,因爲我不能執行我的智能解析...

問:

  1. 是否有另一種方式來獲得所有的鑰匙?
  2. 你知道另一種方式來HTML元素的集合綁定到詞典

感謝您的建議

O.

+0

在這裏看到:http://stackoverflow.com/questions/2290473/ivalueprovider-in-mvc-2-rc-2/2290520#2290520 – tvanfosson 2010-02-24 12:59:42

回答

1

我不認爲你能做到它可以在MVC 2中使用。
或者,您可以擴展DefaultModelBinder並覆蓋其一個虛擬方法(如GetModelProperties),然後更改ModelBindingContext中的ModelName。另一種選擇是爲您的Dictionary類型實現自定義的MetadataProvider,您也可以在那裏更改模型名稱。

2

雖然這個問題已被標記爲'已回答',但我認爲以下可能會有幫助。 我有同樣的問題,並看看System.Web.Mvc.DefaultValueProvider的源代碼。它從RouteData,查詢字符串或請求表單提交(按照該確切順序)獲取它的值。要收集所有的鍵(這是你在第一個問題中要求的),我寫了下面的幫助方法。

private static IEnumerable<string> GetKeys(ControllerContext context) 
{ 
    List<string> keys = new List<string>(); 
    HttpRequestBase request = context.HttpContext.Request; 
    keys.AddRange(((IDictionary<string, 
     object>)context.RouteData.Values).Keys.Cast<string>()); 
    keys.AddRange(request.QueryString.Keys.Cast<string>()); 
    keys.AddRange(request.Form.Keys.Cast<string>()); 
    return keys; 
} 

您可以使用此方法來枚舉密鑰:

foreach (string key in GetKeys(controllerContext)) 
{ 
    // Do something with the key value. 
} 
+0

我現在看到,由於GetKeys代碼直接訪問Request.Form和Request.QueryString,因此我的方法不允許簡單地測試自定義模型綁定器。我會檢查是否可以改進。 – Jeroen 2012-01-19 06:41:18