因此,我一直在阅读有关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);
}
}
但我明白这不是模型绑定器的意图。我在这里俯瞰什么?
答案 0 :(得分:0)
所以我上面的解决方案有效,但我不建议。
我正在寻找的行为(基于其他参数的条件参数绑定)对于框架来说并不是原生的,虽然你可以将其破解到模型绑定器中,但有很多原因&# 39;一个坏主意。
您最好的选择是在控制器内部设置单独的端点或逻辑