2014-02-12 2 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, которые вы можете использовать, чтобы расширить только определенное поведение, а не на самом деле обработки построение модели.

EDIT:

Из ваших комментариев я понимающие, что вы только хочешь, чтобы обработать одно свойства в несколько ViewModels вы могли бы (возможно, несколько ViewModels имеют десятичные, которые приходят с точки зрения в другом формате, чем что MVC ожидает для десятичных знаков.

В этом случае я бы использовал другой подход. Вместо того, чтобы регистрировать ModelBinder в global.asax, я удалю его оттуда и сделаю это декларативно на реальных свойствах, которые нуждаются в этом Специальный формат.

Такие, как:

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

Это основано на общем подходе создания PropertyBindingAttribute: http://www.prideparrot.com/blog/archive/2012/6/customizing_property_binding_through_attributes или https://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

согласился. Будем очень благодарны, если хотите, можете немного поучить. То, что вы говорите, это Model, я должен изменить свойство и вернуть свойство, а не полную модель. Прежде чем я попробовал это раньше. Необходимо изменить только десятичное свойство. Проблема: К сожалению, в Global.asax у меня уже есть клиентское связующее с десятичной запятой. Я попробовал: ModelBinders.Binders.Add (типof (десятичный), новый CurrencyModelBinder()); ModelBinders.Binders.Add (типof (десятичный), новый TxTransactionModelBinder()); но был ошибкой "Элемент с тем же ключом уже добавлен." – Toubi

+0

См. Это для получения более подробной информации http://stackoverflow.com/questions/21717757/cant-add-new-custom-model-binder-error-an-item-with-the-same-key-has- уже -b? noredirect = 1 # comment32841219_21717757 – Toubi

+0

это означает, что в global.asax я могу зарегистрировать 2 пользовательских привязки модели одного и того же типаof (в этом случае typeof (десятичный))? Я ценю ваш подход, но просто хочу спросить, не возможно ? Как вы будете делать, если вам нужно делать из 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

Смежные вопросы