我写了模型绑定器的覆盖程序。
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。有什么更新过的东西可以改变这种行为吗?
发布于 2016-03-28 17:51:41
我还有一个javascript服务(以角度表示),它向我的一个控制器发出AJAX请求。 ..。 这方面的问题是,我不能使用我的自定义绑定,因为其他块从未被调用。
它为null,因为它无法根据它试图绑定到的模型名称找到数据。该名称是否可以找到值取决于模型名称和在客户端请求中发送的数据,这些数据必须对齐/匹配。但是,在任何人告诉您为什么不匹配的数据(包括您的模型与数组)可以从客户端以三种方式之一发送之前:
?myArray=1&myArray=2&myArray=3.这意味着,在您的模型绑定,您将不得不考虑这一点。data (body),那么它可能是一个实际的数组对象。json中的示例:{"myArray":[1,2,3,4]}所以,为了更好地回答你的问题,你需要提供
因此,简单地说:bindingContext.ModelName是预期的名称,必须与您的模型绑定程序试图查找的数据匹配。如果您发送的是{"myArray":[1,2,3,4]},但是您的模型属性名为ProductIds,那么它将始终为null。
我最近更新了4.5到5.2。
不,据我所知没有。
最后的想法。如果类型匹配,还可以让默认的模型绑定器执行,然后使用返回的值执行一些操作。如果绑定现在没有问题,但您想做一些后处理,这将是一个更好的选择。示例:
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;
}发布于 2016-04-02 20:12:53
请确保你做过这样的事情:-
[ModelBinder(typeof(HomeCustomBinder))]来指定:
HttpPost公共ActionResult索引(ModelBinder(typeof(HomeCustomBinder)) HomePageModels home) { if (ModelState.IsValid) { ViewBag.Title = home.Title;ViewBag.Date = home.Date;}返回视图();}https://stackoverflow.com/questions/36185084
复制相似问题