0

我发送发布请求并获得响应正文表单数据:0[family]=Marco&0[name]=Polo&0[age]=66&1[family]=Family&0[name]=Name&0[age]=22

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 [name] = Polo”的数据,它没有绑定到模型用户。模型用户中不存在属性“名称”。
  • 我想知道是否有更多数据作为响应,然后我们可以绑定。

我该怎么做?

4

1 回答 1

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)”之前。

于 2017-04-14T16:02:01.603 回答