我正在为第三方 API 创建回调端点。 调用者将 POST 多部分表单数据给它。
像这样:
public SomeApiController : ApiController {
public AModel Post(AModel input) {
return input; //for demonstration
}
}
它将发布的一些字段的名称中有破折号,这不能是实际的 .NET 属性名称。因此,我使用 [DataContract] 和 [DataMember(name="blah")] 来定义序列化规则。
型号:
//input model class
[DataContract]
public class AModel {
[DataMember]
public string NormalProperty {get; set;} //value set appropriately
[DataMember(Name="abnormal-property")]
public string AbnormalProperty {get; set;} //always null (not serializing)
}
对于标准的 XML 和 JSON 帖子,这可以正常工作。 Normal 和 AbnormalProperty 已设置,我可以继续我的业务了。
但是,对于表单数据的任何变体(表单数据、multiplat/form-data、x-urlencoded-form-data),AbnormalProperty 无法正确反序列化到模型中,并且始终为 null。
是否有我缺少的指令或其他内容?
最佳答案
我试过你的例子,我的结论是 ASP.NET MVC 中的 DefaultModelBinder
不支持 POST 变量的命名。
一个明显的解决方案是不要在您的名字中使用破折号。
如果这不是一个选项,那么您可以为该特定模型实现您自己的模型绑定(bind)器,以处理您发送到 MVC Controller 的异常名称。以下是自定义模型 Binder 的示例:
public class AModelDataBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(AModel))
{
var request = controllerContext.HttpContext.Request;
string normal = request.Form.Get("normalproperty");
string abnormal = request.Form.Get("abnormal-property");
return new AModel
{
NormalProperty = normal,
AbnormalProperty = abnormal
};
}
return base.BindModel(controllerContext, bindingContext);
}
}
然后您必须在 Global.asax 中注册此自定义 Binder :
ModelBinders.Binders.Add(typeof(AModel), new AModelDataBinder());
最后,您可以在 Controller 中使用自定义 Binder :
[HttpPost]
public ActionResult Index([ModelBinder(typeof(AModelDataBinder))]AModel input)
{
// Handle POST
return View();
}
关于c# - 在 POST 中从表单序列化备用属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26440811/