2017-04-13 58 views
0

我發送post請求並獲得響應體數據: 0 [家族] = Marco & 0 [name] = Polo & 0 [年齡] = 66 & 1 [家庭] =家庭& 0 [名稱] =名稱& 0 [年齡] = 22發現屬性,沒有從響應體(表單數據)綁定到模型MVC,默認模型綁定器

var formData = "0[family]=Marco&0[name]=Polo&0[age]=66&1[family]=Family&0[name]=Name&0[age]=22"; 
var data = new Dictionary<string, string>(); 
var preData = HttpUtility.ParseQueryString(formData); 

foreach (string key in preData.AllKeys) 
{ 
    if (key != null) 
    { 
     data.Add(Replace(key), preData[key]); 
    } 
} 

我有模型:

public class User { 
    public string Family {get;set;} 
    public int Age {get;set;} 
} 

對於綁定我用DefaultModelBinder

private static bool TryUpdateModel(User user, IDictionary<string, string> formdata, ModelStateDictionary modelState) where TModel : class 
{ 
    var binder = new DefaultModelBinder(); 

    var valueProvider = new DictionaryValueProvider<string>(formdata, CultureInfo.InvariantCulture); 

    var bindingContext = new ModelBindingContext 
    { 
     ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => user, typeof(User)), 
     ModelState = modelState, 
     PropertyFilter = propertyName => true, 
     ValueProvider = valueProvider 
    }; 

    var ctx = new ControllerContext(); 
    binder.BindModel(ctx, bindingContext); 
    return modelState.IsValid; 
} 
  • 我想知道,我有數據性反應「0名] =波羅」,這不結合模式用戶。屬性「名稱」在模型用戶中不存在。
  • 我想知道如果在迴應更多的數據,然後我們可以綁定。

我可怎麼辦呢?

+0

如果我理解正確的話,你要檢查的TModel具有比你要綁定到User類之外的其他其他屬性?如果是這樣,你是否嘗試過使用反射來檢查TModel的屬性(即typeof(TModel).GetProperties())? – michealt17

+0

我解決了我的問題。 TModel是用戶。我想知道表單數據是否有其他屬性,然後模型用戶。如果我有1個模型,我可以使用typeof(TModel).GProProperties()。但是如果我有模型列表? – Elena

回答

1

您仍然需要將模型的形式比較數據在每種情況下,所以你可以嘗試像下面的東西:

public bool HasAdditionalVals<TModel>(TModel model, IDictionary<string, string> formData) 
{ 
    var propsNameList = new List<string>(); 
    var propsList = typeof(TModel).GetProperties().ToList(); 
    propsList.ForEach(p => propsNameList.Add(p.Name.ToLower())); 

    var keysList = formdata.Keys.ToList() 
    var additionalProps = keysList.Except(propsNameList); 
    return additionalProps.Count() > 0; 
} 

然後,您可以您的「TryUpdateModel」或在調用這個無論你需要檢查如果表單數據比您嘗試綁定的模型具有更多屬性。只是要注意,這是依賴於小寫形式的數據鍵。如果沒有,你必須確保它們在調用'keysList.Except(propsNameList)'之前。