MVC 5模型活页夹替代

Rhs*_*Rhs 5 c# ajax asp.net-mvc

我写了Model 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;
}
Run Code Online (Sandbox Code Playgroud)

我也有一个javascript服务(在Angular中),该服务向我的一个控制器发出AJAX请求。

AJAX请求尝试发布一个整数集合。我试着逐步通过模型活页夹,似乎value总是null。并且通过某种魔术,base.BindModel()仍然能够将我的集合绑定到正确的C#对象。

问题是我不能使用我的自定义活页夹,因为else永远不会调用该块。除了使用之外,还有其他方法可以获取值ValueProvider吗?

我还相信,在此自定义绑定程序正常工作之前(可能是从内存中提取错误)。我最近从4.5更新到5.2.something。是否有任何更新可以改变这种行为?

Igo*_*gor 4

我还有一个 javascript 服务(以 Angular 形式),可以向我的控制器之一发出 AJAX 请求。

...

问题是我无法使用自定义绑定器,因为 else 块从未被调用。

  • 我假设您已经在全局或在操作本身的一个或多个参数上正确注册了您的绑定器。
  • 我还将假设您的活页夹在您期望的时候被调用。

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

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

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

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

回顾一下:bindingContext.ModelName是预期的名称,并且必须与模型绑定器尝试查找的数据匹配。如果您正在发送{"myArray":[1,2,3,4]}但您的模型属性已命名,ProductIds那么它将始终为空。

我最近从 4.5 更新到 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;
}
Run Code Online (Sandbox Code Playgroud)