标签: custom-model-binder

如何从 WebAPI 中的自定义绑定器调用默认模型绑定?

我在 WebAPI 中有一个自定义模型绑定器,它使用来自“Sytem.Web.Http.ModelBinding”命名空间的以下方法,这为 Web API 创建自定义模型绑定的正确命名空间:

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{

}
Run Code Online (Sandbox Code Playgroud)

我有一个HTTP POST控制器,我想使用这个自定义模型绑定器。发布的对象包含大约 100 个字段。我想换 2 个。我需要的是发生默认模型绑定,然后为这两个字段操作该模型绑定对象,以便一旦控制器接收到对象,它就是原始的。

问题是我似乎无法使用上述模型绑定方法中的默认绑定器对我的对象进行模型绑定。在MVC曾有如下:

base.BindModel(controllerContext, bindingContext);

同样的方法也没有在工作的WebAPI。也许我要解决这个错误,还有另一种方法可以完成我想要的,所以请建议自定义模型绑定器是否不是正确的方法。我试图阻止做的是必须在控制器内操作发布的对象。我可以在模型绑定后在技术上做到这一点,但我试图在调用堆栈的早期执行此操作,以便控制器无需担心这两个字段的自定义操作。

如何bindingContext在我的自定义模型绑定器中启动默认模型绑定,以便我有一个完全填充的对象,然后我可以在返回之前操作/按摩我需要的最后 2 个字段?

custom-model-binder asp.net-web-api asp.net-web-api2

7
推荐指数
1
解决办法
2159
查看次数

不区分大小写的模型绑定 MVC 4

我希望我的模型绑定不区分大小写。

我尝试操作从 继承的自定义模型绑定器System.web.Mvc.DefaultModelBinder,但我不知道在哪里添加不区分大小写的内容。

我也看了看IValueProvider,但我不想重新发明轮子并自己找到值。

任何的想法 ?

asp.net-mvc model-binding custom-model-binder value-provider asp.net-mvc-4

6
推荐指数
1
解决办法
5258
查看次数

WebApi2:自定义参数绑定以绑定部分参数

我有一个webApi2项目和另一个项目,其中我有我的Model类和BaseModel,它是所有模型的基础,如下所示,

public class BaseModel
{
    public string UserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所有其他模型都是从我的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)
    { …
Run Code Online (Sandbox Code Playgroud)

model-binding parameterbinding custom-model-binder asp.net-web-api asp.net-web-api2

6
推荐指数
1
解决办法
2377
查看次数

在Web API中创建属性模型绑定器

我为一个复杂的类创建了ModelBinder。我想在属性上重用此ModelBinder。因此可以在Web API的属性上使用ModelBinder。我正在寻找一个示例实现,该实现提供像MVC一样的属性绑定器。下面是我遇到的参考链接,但是这些实现是针对MVC的。任何帮助表示赞赏。

参考链接1

参考链接2

c# custom-model-binder asp.net-web-api asp.net-web-api2

6
推荐指数
1
解决办法
1212
查看次数

ASP.NET Core 1 (RTM) 中的自定义日期时间模型绑定器

我正在编写 ASP.NET Core 1 应用程序,它有一个 Web API 控制器,供应商将在其中发布数据。

这是 Model 类的简化版本,我会将传入数据绑定到该类:

public class Lead
{
    public int SupplierId { get; set; }
    public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题是日期将以德语格式发布,例如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 …
Run Code Online (Sandbox Code Playgroud)

c# model-binding custom-model-binder asp.net-core-mvc asp.net-core-webapi

6
推荐指数
1
解决办法
3042
查看次数

缺少.NET Core 2中的TaskCache类

我在.NET Core 1.x中创建了一个自定义模型绑定器.它运行良好,如官方教程中所示.

一旦更新到2.0,我就再也无法编译了.在旧版本中它是

return TaskCache.CompletedTask; 
Run Code Online (Sandbox Code Playgroud)

现在TaskCache静态类不再可用了.

有没有人知道解决方法?

core custom-model-binder .net-core asp.net-core

6
推荐指数
1
解决办法
689
查看次数

.NET核心自定义和默认绑定组合

我正在为视图模型创建自定义模型活页夹,实现 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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想执行默认的模型绑定,然后应用自定义绑定,类似于本SO帖子中采用的方法,但适用于.NET Core,而不是框架。

我以为应用默认绑定会很简单,但是还没有找到方法。我相信该解决方案将涉及ComplexTypeModelBinderComplexTypeModelBinderProvider类,但似乎无法找出解决方法。

我知道我可以在POST请求命中我的控制器方法时进行任何更改,但这似乎是错误的位置和错误的时间。

defaultmodelbinder model-binding custom-model-binder asp.net-core-mvc asp.net-core

6
推荐指数
1
解决办法
1102
查看次数

自定义模型绑定器不会为 ASP.NET Core 2 中的单个属性触发

我已经尝试过这个,但我不认为这是我的情况。这也行不通。

我正在使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我有了一个模型。这个:

public class UserRegistrationInfo
{
    public string Email { get; set; }

    [ModelBinder(BinderType = typeof(SanitizeModelBinder))]
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及一个动作方法:

[AllowAnonymous]
[HttpPost("register")]
public async Task<IActionResult> RegisterAsync([FromBody] UserRegistrationInfo registrationInfo)
{
    var validationResult = validateEmailPassword(registrationInfo.Email, registrationInfo.Password);
    if (validationResult != …
Run Code Online (Sandbox Code Playgroud)

asp.net custom-model-binder asp.net-core asp.net-core-webapi asp.net-core-2.0

6
推荐指数
1
解决办法
2318
查看次数

通过ASP.Net Core中的主体进行自定义模型绑定

我想通过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;
...
Run Code Online (Sandbox Code Playgroud)

modelNameviewModel(说实话,我不知道为什么,但它的工作原理...)

我的控制器看起来像这样

    [HttpPost]
    [Route("my/route")]
    public IActionResult CalcAc([ModelBinder(BinderType = typeof(MyModelBinder))]IViewModel viewModel)
    {
   ....
Run Code Online (Sandbox Code Playgroud)

即,当我发出此HTTP-Post请求时,它起作用

url/my/route?viewModel=URLparsedJSON
Run Code Online (Sandbox Code Playgroud)

但是,我想通过请求的正文,即

public IActionResult Calc([FromBody][ModelBinder(BinderType = typeof(MyModelBinder))]IViewModel viewModel)
Run Code Online (Sandbox Code Playgroud)

然后在我的Modelbinder中,modelName为“”,并且ValueProvider产生null ...我在做什么错?

更新

例; 假设你有一个接口IGeometry和不同的2D图形的许多实现,比如Circle: IGeometryRectangle: IGeometryPolygon: …

custom-model-binder asp.net-core

6
推荐指数
1
解决办法
130
查看次数

我可以在Global.asax以外的地方注册自定义模型绑定器吗?

仅限于特定控制器操作方法或其整个控制器的自定义模型绑定器的范围是很方便的.Hanselman写了一句话暗示了自定义模型绑定器注册的替代位置,但似乎从未完成这个想法:

你可以要么把这个自定义的模型绑定负责所有DateTime是否通过在Global.asax它注册

是否可以在控制器系统的较小范围内进行这些注册?如果是这样,有没有理由避免在Global.asax MvcApplication之外这样做(例如,性能原因)?

custom-model-binder asp.net-mvc-2

5
推荐指数
1
解决办法
1473
查看次数