Web API - 基于URL段反序列化主体 - 模型Binder或媒体格式化程序?

时间:2014-11-27 00:06:55

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

因此,我一直在阅读有关Web API内容协商的内容,并且我有点困惑,试图将它们联系在一起以找到我面临的问题的解决方案。

我使用属性绑定,所以我的Controller方法如下所示:

    [Route("{user}/{platform}/profile")]
    [HttpPut]
    public async Task UpdateProfile([ModelBinder]AppUser user, Platform platform, [FromBody] IProfile profile)

平台是列出我们各种产品平台(与软件/ OS平台无关)的枚举,例如阿尔法,贝塔,查理。我们有相应的IProfile实现AlphaProfile,BetaProfile,CharlieProfile。

用户和平台参数反序列化只是查找和花花公子。但是,我无法找到使我的应用程序反序列化为正确对象的正确方法。目前我有一个像这样的IModelBinder实现:

    public class ProfileModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {            
        object platformParameterFromQueryString;

        if (actionContext.RequestContext.RouteData.Values.TryGetValue("platform", out platformParameterFromQueryString))
        {
            Platform platformParameter;

            if (platformParameterFromQueryString == null || !Enum.TryParse<Platform>(platformParameterFromQueryString.ToString(), out platformParameter))
                throw new ArgumentException("platform parameter not found");

            if (platformParameter== Platform.Alpha)
            {
                var jsonContent = actionContext.Request.Content.ReadAsStringAsync().Result;

                bindingContext.Model = JsonConvert.DeserializeObject<AlphaProfile>(jsonContent);
            }
            else
            {
                throw new NotImplementedException();
            }
        }



        return (bindingContext.Model != null);
    }
}

但我明白这不是模型绑定器的意图。我在这里俯瞰什么?

1 个答案:

答案 0 :(得分:0)

所以我上面的解决方案有效,但我不建议。

我正在寻找的行为(基于其他参数的条件参数绑定)对于框架来说并不是原生的,虽然你可以将其破解到模型绑定器中,但有很多原因&# 39;一个坏主意。

您最好的选择是在控制器内部设置单独的端点或逻辑