微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – MVC 5模型绑定器覆盖

我写了一个模型Binder的覆盖.

public override object BindModel(Controller context, ModelBindingContext bindingContext)
{
    var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

    object returnVal = null;

    if (value == null)
        returnVal = base.BindModel(controllerContext, bindingContext);
    else
    {
        /* custom logic here that never seems to get called.
            returnVal = something();
        */
    }

    return returnVal;
}

我还有一个javascript服务(在Angular中)向我的一个控制器发出一个AJAX请求.

AJAX请求尝试发布一组int.我尝试单步执行模型绑定器,似乎值始终为null.通过一些魔术,base.BindModel()仍然能够将我的集合绑定到正确的C#对象.

这个问题是我不能使用我的自定义绑定器,因为从不调用else块.除了使用ValueProvider之外,还有其他方法可以获得价值吗?

我也相信在这自定义绑定器正常工作之前(从内存可能是错误的).我最近从4.5更新到5.2.something.是否有任何更新可以改变这种行为?

解决方法:

I also have a javascript service (in Angular) that makes an AJAX request to one of my controllers.

The problem with this is that I can’t use my custom binder as the else block is never invoked.

>我将假设您已在一个或多个参数上全局或在操作本身上正确注册了活页夹.
>我还假设您的活页夹是在您预期的时候被调用的.

它为null,因为它无法根据您尝试绑定的模型名称查找数据.是否可以通过此名称找到该值取决于型号名称和客户端请求中发送的必须对齐/匹配的数据.但在任何人都可以告诉你为什么它不匹配的数据(包括你的模型与数组)可以通过以下三种方式之一从客户端发送:

>如果使用URL,您将在查询字符串中重用相同的属性名称.示例:?myArray = 1& myArray = 2& myArray = 3.这意味着在您的模型绑定器中,您将不得不考虑这一点.
>如果在POST中使用数据(正文),则它可能是实际的数组对象. json中的示例:{“myArray”:[1,2,3,4]}
>您可能还会序列化整个表单并使用Angular发送它(这将允许您更好地使用MVC中的绑定功能)

因此,为了更好地回答您的问题,您需要提供

>数据的格式是从浏览器发送的以及如何发送(查询字符串或数据有效负载)(这可能在您的Angular工厂,服务或控制器中)
>您尝试绑定的模型定义

所以回顾一下:bindingContext.ModelName是期望的名称,必须与模型绑定器试图找到的数据匹配.如果您要发送{“myArray”:[1,2,3,4]},但您的模型属性名为ProductIds,那么它将始终为null.

I recently updated from 4.5 to 5.2.something

不,不是我知道的.

最后的想法.您还可以让认模型绑定器执行,然后在类型匹配时使用返回值执行某些操作.如果绑定现在没有问题,但你想做一些后处理,这将是一个更好的选择.例:

public override object BindModel(Controller context, ModelBindingContext bindingContext)
{
    var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

    object returnVal = base.BindModel(controllerContext, bindingContext);

    /* check returnVal and then additional custom logic here */.

    return returnVal;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐