2017-04-13 57 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)'之前。