模型绑定 – WebApi2:自定义参数绑定以绑定部分参数
发布时间:2020-09-21 14:13:00 所属栏目:asp.Net 来源:互联网
导读:我有一个webApi2项目和另一个项目,其中我有我的Model类和BaseModel,它是所有模型的基础,如下所示, public class BaseModel{ public string UserId { get; set; }} 所有其他模型都是从我的BaseModel派生的. 在webapi我有我的CustomerController如下, public cl
|
我有一个webApi2项目和另一个项目,其中我有我的Model类和BaseModel,它是所有模型的基础,如下所示, public class BaseModel
{
public string UserId { get; set; }
}
所有其他模型都是从我的BaseModel派生的. 在webapi我有我的CustomerController如下, public class CustomerController : ApiController
{
[HttpPost]
public GetCustomerResponseModel Get(GetCustomerRequestModel requestModel)
{
var response = new GetCustomerResponseModel();
//I need only the UserId coming from the BaseModel is binded from request headers
var userId = requestModel.UserId;
//I want all model data except UserId is binded with default model binding
var customerData = requestModel.CustomerData;
var someOtherData = requestModel.SomeOtherData;
return response;
}
[HttpPost]
public AddStockAlertResponseModel AddStockAlert(AddStockAlertRequestModel requestModel)
{
var response = new AddStockAlertResponseModel();
//I need only the UserId coming from the BaseModel is binded from request headers
var userId = requestModel.UserId;
//I want all model data except UserId is binded with default model binding
var stockInfo = requestModel.StockInfo;
return response;
}
}
每个发送到CustomerController的请求在请求标头中都有一个“UserId”标头,我需要一个ModelBinder或ParameterBinder或一些功能,它只从请求标头绑定UserId而不触及其他模型参数.我的意思是除了UserId之外的模型参数默认是绑定的. 我不想使用AOP或拦截器或方面..是否可以仅使用asp.net功能绑定UserId,如模型绑定器,参数绑定器等. 解决方法以下是使用HttpParameterBinding的快速示例.在这里,我创建一个自定义参数绑定,我让默认的基于FromBody的绑定使用格式化程序来反序列化请求主体,然后从请求标头获取用户标识并在反序列化对象上设置. (您可能需要在以下代码上添加其他验证检查).config.ParameterBindingRules.Insert(0,(paramDesc) =>
{
if (typeof(BaseModel).IsAssignableFrom(paramDesc.ParameterType))
{
return new BaseModelParamBinding(paramDesc);
}
// any other types,let the default parameter binding handle
return null;
});
public class BaseModelParamBinding : HttpParameterBinding
{
HttpParameterBinding _defaultFromBodyBinding;
HttpParameterDescriptor _paramDesc;
public BaseModelParamBinding(HttpParameterDescriptor paramDesc)
: base(paramDesc)
{
_paramDesc = paramDesc;
_defaultFromBodyBinding = new FromBodyAttribute().GetBinding(paramDesc);
}
public override async Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider,HttpActionContext actionContext,CancellationToken cancellationToken)
{
await _defaultFromBodyBinding.ExecuteBindingAsync(metadataProvider,actionContext,cancellationToken);
BaseModel baseModel = actionContext.ActionArguments[_paramDesc.ParameterName] as BaseModel;
if (baseModel != null)
{
baseModel.UserId = actionContext.Request.Headers.GetValues("UserId").First();
}
}
} (编辑:日照站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 文件上传MVC
- asp.net – 在Azure网站上启用gzip压缩
- asp.net-mvc – 存储库与DAL中的服务模式:EF和Dapper
- asp.net-mvc – 在EditorFor for child对象中使用时,MVC无法
- asp.net-mvc – 使用Asp.net MVC 4中的OutputCacheAttribut
- asp.net-mvc – 为什么MVC4捆绑捆绑Knockout.js?
- asp.net – 使用umbraco的iis应用程序池使用过多的内存
- asp.net – 我应该在哪里放置scriptmanager
- ASP.NET web.config文件是否失控?
- 使用ASP.Net MVC与经典ADO.Net
推荐文章
站长推荐
- asp.net – 如何使用JwtSecurityTokenHandler和J
- asp.net-mvc – 使用没有ORM的ASP.NET MVC
- 在ASP.NET中使用querystring的最佳做法?
- asp.net-mvc – MicrosoftMvcValidation.js VS j
- .net – 扩展自定义成员资格提供程序
- 如果我的Asp.Net会话有IsNewSession == true,那我
- asp.net mvc – 如何实现面包屑助手在asp.net mv
- asp.net-mvc – ViewModel中的最佳实践
- asp.net-mvc – 如何将Model字段值传递给javascr
- asp.net-mvc – 根据浏览器接受语言自动设置uiCu
热点阅读
