public class UsernameBinder: System.Web.Http.ModelBinding.IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var key = bindingContext.ModelName;
var val = bindingContext.ValueProvider.GetValue(key);
if (val != null)
{
//?????????????????????????????????????????
//Get username property of user
//Set username property = User.Identity.Name
}
return false;
}
}
我想创建一个自动绑定用户名的模型绑定器。但是我没有获得财产。
我会像这样使用它:
public SendMessage CreateMessage([ModelBinder(typeof(UsernameBinder))]Message message)
{
}
如何从Web API获取模型的属性?
答案 0 :(得分:0)
我建议您阅读http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api这可以帮助您将操作方法的模型绑定到User
。现在让WebApi中的用户使用稍微不同的对话(对于WebApi而不是WebApi 2)
如
var username = ((ApiController)context.ControllerContext.Controller).User.Identity.Name;
答案 1 :(得分:0)
我不知道我是否真的理解你的问题,但我在一段时间之前解决了这样的问题。
问题:如何在WebAPI控制器操作中获取currentUserId?
// ex: update method
public IHttpActionResult Put(int id, [FromBody] MyModel model, Guid userId)
<强>解决方案强>:
声明绑定和属性:
public class CurrentUserIDParameterBinding : HttpParameterBinding
{
public CurrentUserIDParameterBinding(HttpParameterDescriptor parameter)
: base(parameter)
{
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider,
HttpActionContext actionContext, CancellationToken cancellationToken)
{
Guid userId = /* my userid based on provider */;
actionContext.ActionArguments[Descriptor.ParameterName] = userId;
return Task.FromResult<object>(null);
}
}
public class CurrentUserIDAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
return new CurrentUserIDParameterBinding(parameter);
}
}
并像这样使用它:
public IHttpActionResult Put(int id, [FromBody] MyModel model, [CurrentUserID] Guid userId)
答案 2 :(得分:0)
您可能想要添加自定义参数绑定规则吗?
像这样:config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);