首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 5模型绑定覆盖

MVC 5模型绑定覆盖
EN

Stack Overflow用户
提问于 2016-03-23 17:39:41
回答 2查看 4.6K关注 0票数 5

我写了模型绑定器的覆盖程序。

代码语言:javascript
复制
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服务(以角度表示),它向我的一个控制器发出AJAX请求。

AJAX请求试图发布一个ints集合。我尝试了一下模型绑定,看起来value总是空的。通过某种魔力,base.BindModel()仍然能够将我的集合绑定到正确的C#对象。

问题在于我不能使用我的自定义绑定器,因为else块从未被调用过。除了使用ValueProvider之外,还有别的方法可以得到值吗?

我还相信,在这个定制的活页夹正确工作之前(从内存中看,可能是错误的)。我最近更新了从4.5到5.2。有什么更新过的东西可以改变这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 17:51:41

我还有一个javascript服务(以角度表示),它向我的一个控制器发出AJAX请求。 ..。 这方面的问题是,我不能使用我的自定义绑定,因为其他块从未被调用。

  • 我将假设您已经正确地注册了您的活页夹,无论是在全球范围内,还是在一个或多个参数上操作本身。
  • 我还将假设,当您期望时,会调用您的活页夹。

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

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

所以,为了更好地回答你的问题,你需要提供

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

因此,简单地说:bindingContext.ModelName是预期的名称,必须与您的模型绑定程序试图查找的数据匹配。如果您发送的是{"myArray":[1,2,3,4]},但是您的模型属性名为ProductIds,那么它将始终为null。

我最近更新了4.5到5.2。

不,据我所知没有。

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

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2016-04-02 20:12:53

请确保你做过这样的事情:-

  1. 自定义模型绑定:- 公共类HomeCustomDataBinder : DefaultModelBinder {公共覆盖对象BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { if (bindingContext.ModelType == typeof(HomePageModels)) { HttpRequestBase request = controllerContext.HttpContext.Request;string title = request.Form.Get("Title");string day = request.Form.Get("Day");string month =request.Form.Get(“月份”);字符串年份=request.Form.Get(“年份”);返回新的HomePageModels {HomePageModels{ Title = title,Date = day +“/+ month + "/”+年“};/调用默认的模型绑定器这个新的绑定上下文//返回base.BindModel(controllerContext,newBindingContext);}{返回base.BindModel(controllerContext,bindingContext);}
  2. 一旦我们完成了自定义类的编码,我们就需要注册这个类,就像我在Global.asax中Application_Start()下所做的那样。 WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();ModelBinders.Binders.Add(typeof(HomePageModels),new HomeCustomBinder();} 3)最后,我们需要通知控制器我们希望它使用的绑定。我们可以如下所示使用属性[ModelBinder(typeof(HomeCustomBinder))]来指定: HttpPost公共ActionResult索引(ModelBinder(typeof(HomeCustomBinder)) HomePageModels home) { if (ModelState.IsValid) { ViewBag.Title = home.Title;ViewBag.Date = home.Date;}返回视图();}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36185084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档