我在 WebAPI 中有一个自定义模型绑定器,它使用来自“Sytem.Web.Http.ModelBinding”命名空间的以下方法,这是为 Web API 创建自定义模型绑定器的正确命名空间:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
}
我有一个HTTP POST控制器,我想使用这个自定义模型绑定器。发布的对象包含大约 100 个字段。我想换 2 个。我需要的是发生默认模型绑定,然后为这两个字段操作该模型绑定对象,以便一旦控制器接收到对象,它就是原始的。
问题是我似乎无法使用上述模型绑定方法中的默认绑定器对我的对象进行模型绑定。在MVC曾有如下:
base.BindModel(controllerContext, bindingContext);
同样的方法也没有在工作的WebAPI。也许我要解决这个错误,还有另一种方法可以完成我想要的,所以请建议自定义模型绑定器是否不是正确的方法。我试图阻止做的是必须在控制器内操作发布的对象。我可以在模型绑定后在技术上做到这一点,但我试图在调用堆栈的早期执行此操作,以便控制器无需担心这两个字段的自定义操作。
如何bindingContext在我的自定义模型绑定器中启动默认模型绑定,以便我有一个完全填充的对象,然后我可以在返回之前操作/按摩我需要的最后 2 个字段?
我希望我的模型绑定不区分大小写。
我尝试操作从 继承的自定义模型绑定器System.web.Mvc.DefaultModelBinder,但我不知道在哪里添加不区分大小写的内容。
我也看了看IValueProvider,但我不想重新发明轮子并自己找到值。
任何的想法 ?
asp.net-mvc model-binding custom-model-binder value-provider asp.net-mvc-4
我有一个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)
    { …model-binding parameterbinding custom-model-binder asp.net-web-api asp.net-web-api2
我为一个复杂的类创建了ModelBinder。我想在属性上重用此ModelBinder。因此可以在Web API的属性上使用ModelBinder。我正在寻找一个示例实现,该实现提供像MVC一样的属性绑定器。下面是我遇到的参考链接,但是这些实现是针对MVC的。任何帮助表示赞赏。
我正在编写 ASP.NET Core 1 应用程序,它有一个 Web API 控制器,供应商将在其中发布数据。
这是 Model 类的简化版本,我会将传入数据绑定到该类:
public class Lead
{
    public int SupplierId { get; set; }
    public DateTime Date { get; set; }
}
问题是日期将以德语格式发布,例如30.09.2016. 我不想将应用程序的全球文化设置为,de-DE因为 a) 我不是德国人,并且 b) 应用程序的其余部分将使用 ISO 日期。
我已经准备好编写一个自定义的IModelBinder,因为它在 ASP.NET Core MVC 中显然是强制性的,一个IModelBinderProvider.
这是我的实现IModelBinderProvider:
public class GermanDateTimeModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));
        if (!context.Metadata.IsComplexType && 
                context.Metadata.ModelType == typeof(DateTime))
            return new …c# model-binding custom-model-binder asp.net-core-mvc asp.net-core-webapi
我在.NET Core 1.x中创建了一个自定义模型绑定器.它运行良好,如官方教程中所示.
一旦更新到2.0,我就再也无法编译了.在旧版本中它是
return TaskCache.CompletedTask; 
现在TaskCache静态类不再可用了.
有没有人知道解决方法?
我正在为视图模型创建自定义模型活页夹,实现 IModelBinder
我的视图模型中有很多属性,其中大多数不需要任何自定义绑定。与其从单独显式设置模型上的所有属性值,不如让ModelBindingContext我能够获得为我绑定模型的框架,然后执行任何自定义绑定:
public class ApplicationViewModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        // get .net core to bind values on model
        // Cary out any customization of the models properties
        bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);
        return Task.CompletedTask; 
    }
}
基本上,我想执行默认的模型绑定,然后应用自定义绑定,类似于本SO帖子中采用的方法,但适用于.NET Core,而不是框架。
我以为应用默认绑定会很简单,但是还没有找到方法。我相信该解决方案将涉及ComplexTypeModelBinder和ComplexTypeModelBinderProvider类,但似乎无法找出解决方法。
我知道我可以在POST请求命中我的控制器方法时进行任何更改,但这似乎是错误的位置和错误的时间。
defaultmodelbinder model-binding custom-model-binder asp.net-core-mvc asp.net-core
我正在使用 ASP.NET Core 2 Web API。我刚刚创建了一个虚拟模型活页夹(它的作用现在并不重要):
public class SanitizeModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        var modelName = bindingContext.ModelName;
        return Task.CompletedTask;
    }
}
现在,我有了一个模型。这个:
public class UserRegistrationInfo
{
    public string Email { get; set; }
    [ModelBinder(BinderType = typeof(SanitizeModelBinder))]
    public string Password { get; set; }
}
以及一个动作方法:
[AllowAnonymous]
[HttpPost("register")]
public async Task<IActionResult> RegisterAsync([FromBody] UserRegistrationInfo registrationInfo)
{
    var validationResult = validateEmailPassword(registrationInfo.Email, registrationInfo.Password);
    if (validationResult != …asp.net custom-model-binder asp.net-core asp.net-core-webapi asp.net-core-2.0
我想通过HTTP Post的正文将对象绑定到控制器中。
它像这样工作
public class MyModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
                throw new ArgumentNullException("No context found");
            string modelName = bindingContext.ModelName;
            if (String.IsNullOrEmpty(modelName)) {
                bindingContext.Result = ModelBindingResult.Failed();
                return Task.CompletedTask;
            }
            string value = bindingContext.ValueProvider.GetValue(modelName).FirstValue;
...
该modelName是viewModel(说实话,我不知道为什么,但它的工作原理...)
我的控制器看起来像这样
    [HttpPost]
    [Route("my/route")]
    public IActionResult CalcAc([ModelBinder(BinderType = typeof(MyModelBinder))]IViewModel viewModel)
    {
   ....
即,当我发出此HTTP-Post请求时,它起作用
url/my/route?viewModel=URLparsedJSON
但是,我想通过请求的正文,即
public IActionResult Calc([FromBody][ModelBinder(BinderType = typeof(MyModelBinder))]IViewModel viewModel)
然后在我的Modelbinder中,modelName为“”,并且ValueProvider产生null ...我在做什么错?
更新
例; 假设你有一个接口IGeometry和不同的2D图形的许多实现,比如Circle: IGeometry或Rectangle: IGeometry或Polygon: …
仅限于特定控制器操作方法或其整个控制器的自定义模型绑定器的范围是很方便的.Hanselman写了一句话暗示了自定义模型绑定器注册的替代位置,但似乎从未完成这个想法:
你可以要么把这个自定义的模型绑定负责所有DateTime是否通过在Global.asax它注册
是否可以在控制器系统的较小范围内进行这些注册?如果是这样,有没有理由避免在Global.asax MvcApplication之外这样做(例如,性能原因)?