如何在自定义模型绑定器中获取模型?

时间:2014-02-12 03:38:32

标签: c# .net asp.net-mvc asp.net-mvc-4

我正在尝试使用以下代码创建自定义模型活页夹:

public class TransactionModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        Object Model = bindingContext.Model;

        //Do custom logic

        return Model;
    }
}

在global.asax中,我添加:

ModelBinders.Binders.Add(typeof(TransViewModel), new TransactionModelBinder());

问题: 我不知道如何获得模型。我试过了bindingContext.Model,但它是空的。 如果我在Global.asax中的代码行正常,请指导。

2 个答案:

答案 0 :(得分:2)

请参阅此article

public class HomeCustomDataBinder : DefaultModelBinder
{

    public override object 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("Month");
            string year = request.Form.Get("Year");

            return new HomePageModels
            {
                Title = title,
                Date = day + "/" + month + "/" + year
            };

            //// call the default model binder this new binding context
            //return base.BindModel(controllerContext, newBindingContext);
        }
        else
        {
            return base.BindModel(controllerContext, bindingContext);
        }
    }

} 

答案 1 :(得分:1)

好吧,如果你打算从头开始编写整个活页夹,你将没有模型。相反,你实际上是从表单数据创建模型(因为这是绑定器的用途)。如:

return new SomeModel 
{
    OneProp = request.Form["OneProp"],
    AnotherProp = request.Form["AnotherProp"]
}

或者,您可以继承DefaultModelBinder而不是IModelBinder,您可以使用它来扩展某些行为,而不是实际处理模型的构造。

修改

从你的评论中我理解你只想处理你可能拥有的几个视图模型中的一个属性(可能多个视图模型的小数来自视图,格式与MVC对小数的预期格式不同。

在这种情况下,我实际上使用了不同的方法。我没有在global.asax中注册ModelBinder,而是将其从那里删除,并在需要该特殊格式的实际属性上以声明方式执行。

如:

[PropertyBinder(typeof(MyDecimalBinder))]
public decimal SomePropInAViewModel {get; set;}

这是基于创建PropertyBindingAttribute的常用方法: http://www.prideparrot.com/blog/archive/2012/6/customizing_property_binding_through_attributeshttps://stackoverflow.com/a/12683210/1373170

使用类似于此的ModelBinder:

public class MyDecimalBinder :  DefaultModelBinder {
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) {

        // use the propertyDescriptor to make your modifications, by calling SetProperty()
        ...

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

}

现在,如果这是您想要应用于所有小数的内容,您可能还想查看Phil Haack使用自定义绑定器处理小数的完整实现:​​

http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/