c# - 在 POST 中从表单序列化备用属性名称

标签 c# asp.net asp.net-web-api

我正在为第三方 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/

相关文章:

javascript - 将输入键绑定(bind)到 asp 网络链接按钮转发器

C# - 将 HTML 无序列表转换为 JSON 数组

asp.net-mvc-4 - MVC4 WebAPI 拒绝无效的枚举值

c# - MVC3 多 View 起始页

c# - 无法将用户定义的数据类型参数添加到我的查询中

c# - 使用 EF4 的循环引用

c# - 仅 web api Controller 或 Controller 和 web api Controller

javascript - Angularjs 应用程序无法通过 POST 方法跨域

c# - HttpClient PostAsync() 从不返回响应

c# - ASP.NET 中的 Twitter API 集成