2014-02-12 108 views
0

余米试图创建一个自定义的模型绑定与下面的代码:如何在自定义模型绑定中获取模型?

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代码行是否正常。

回答

1

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

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

或者你可以从DefaultModelBinder而不是IModelBinder,你可以用它来扩展只有某些行为,而不是实际处理模型的构建继承。

编辑:

从您的意见,我的理解是,你只是想处理几个的ViewModels一个属性,你可能有(可能是多个的ViewModels有来自鉴于不同的格式小数什么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//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); 
    } 

} 

现在,如果这是你想要应用于所有小数点的东西,你可能也想看看菲尔哈克完全实现小数使用自定义绑定处理:

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

+0

同意。如果你愿意,可以多指点一点,非常感谢。你说的是从模型,我应该修改一个属性和返回属性,而不是完整的模型? 之前我之前尝试过。只需修改一个小数属性。 问题: 不幸的是,在Global.asax中,我已经有一个带有十进制的客户绑定。我试过: ModelBinders.Binders.Add(typeof(decimal),new CurrencyModelBinder()); ModelBinders.Binders.Add(typeof(decimal),new TxTransactionModelBinder()); 但错误“已添加具有相同密钥的项目。“ – Toubi

+0

详情请参阅 http://stackoverflow.com/questions/21717757/cant-add-new-custom-model-binder-error-an-item-with-the-same-key-has-already -b?noredirect = 1#comment32841219_21717757 – Toubi

+0

是否意味着在global.asax中,我可以注册2个相同类型的自定义模型绑定器(在这种情况下,typeof(decimal))?我很欣赏你的方法,但只是想问一下,是不可能的?如果你必须从global.asax执行,你会怎么做? – Toubi

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); 
     } 
    } 

} 
+0

谢谢。你是一个好帮手。 – Toubi