Tuesday, August 27, 2013

Binding enum arrays with MVC models

The simplicity of model binding in the MVC framework makes it a powerful and pleasant framework to send models up and down to views. But a little short coming prevents the usage of enum arrays and raising maintainability in my opinion. MVC 4 cannot convert / materialize enum values to an array when used in a model. To put it correctly, there is no standard type converter for the job.

This issue manifested when I was working on a checkbox list of statuses that could be selected as a filter. This would then be posted as a comma separated parameter value to be set on the model object. Which is finally used in a LINQ query.

Using the following model would not be working in MCV when an action method accepts it as a parameter. You'd have to use an int array, convert the int array to an enum array or the other way around to send it to the view. Which I find kind of a hassle to me, especially when debugging. Enums are godly when it comes to understand what happens in a process during runtime. Even in JavaScript even though they are string values. It's almost costs no more performance than int values nowadays.

public class CustomerListQueryModel
{
    public string SearchText { get; set; }

    public CustomerStatus[] FilterStatuses { get; set; }
}

The solution to this, as described in lots of other blogs, is to implement your own model binder. A bit of a no-brainer, although my one objection is that a lot of the conversion logic is often not being shared as an all-round conversion standard in the whole system. An unnecessary loss of coherency and potentially increasing risks of bugs in my opinion.

I have been carrying around a conversion API for the past few years which has been proven to be very useful. When used properly it tolerated enough for correct interpretation and is strict enough to prevent faulty conversions. It deals just a little bit better with string-to-type conversions than the daily Parse methods on most value type. Hence it has a generic interface for almost every type. A logical choice to integrate it into the custom model binder.

How the conversion API works in detail can be seen in the following post. The converter is required for this model binder to work correctly, because it provides the custom type converter for value type array's.

Below is the model binder. It is nothing more than a facade that makes use of the converter API.

public class ExtendedModelBinder : DefaultModelBinder
{
 /// <summary>
 /// Provides custom model binding by utilizing the Conversion helper API.
 /// </summary>
 protected override object GetPropertyValue(
  ControllerContext controllerContext,
  ModelBindingContext bindingContext,
  PropertyDescriptor propertyDescriptor, 
  IModelBinder propertyBinder)
 {
  object value = GetCustomConvertedValue(bindingContext, propertyDescriptor); 
    
  if (value != null)
  {
   return value;
  }

  return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
 }

 private static object GetCustomConvertedValue(
  ModelBindingContext bindingContext,
  PropertyDescriptor propertyDescriptor)
 {
  var propertyType = propertyDescriptor.PropertyType;
  var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

  if (providerValue != null && providerValue.RawValue != null)
  {
   return Conversion.AsValue(propertyType, providerValue.RawValue.ToString());
  }

  return null;
 }
}

In the above code, when the model is bound, the model binder will first try to convert by using the conversion API, if that fails (without exception) and returns a null value, the binder falls back on the default MVC logic.

To use the binder is a matter of registration to override the default implementation, like so:

protected void Application_Start()
{
    //// Your other useful code...

    ModelBinders.Binders.DefaultBinder = new ExtendedModelBinder();
}

Voila, all done. MVC will now be using the custom model binder. To check fro sure, you could set a break point to see if the GetPropertyValue method is being called.

21 comments:

  1. i like the way of you have explained the code with the theory. every one can easily understand this with out any confusion. so keep posting such kind of interesting article.
    java training in chennai

    ReplyDelete
  2. Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post.
    nescafe

    ReplyDelete
  3. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  4. شركة السالم لخدمات التنظيف ومكافحة الحشرات ونقل العفش مع الفك والتركيب بالطائف يتم العمل لدينا من خلال فريق وعماله فنيه مدربه في غاية الاتقان ومن خلال احدث المعدات والاداوات مع شركة السالم فانت دائما في راحة تامه وامن مستمر
    شركة تنظيف بالطائف
    شركة تنظيف مجالس بالطائف
    شركة تنظيف خزانات بالطائف
    شركة مكافحة حشرات بالطائف
    شركة رش مبيدات بالطائف
    شركة عزل اسطح بالطائف
    شركة تسليك مجاري بالطائف
    شركة نقل اثاث بالطائف


    ReplyDelete
  5. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  6. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  7. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  8. شركة السالم لخدمات التنظيف ومكافحة الحشرات ونقل العفش مع الفك والتركيب بالطائف يتم العمل لدينا من خلال فريق وعماله فنيه مدربه في غاية الاتقان ومن خلال احدث المعدات والاداوات مع شركة السالم فانت دائما في راحة تامه وامن مستمر
    شركة تنظيف بالطائف
    شركة تنظيف مجالس بالطائف
    شركة تنظيف خزانات بالطائف
    شركة مكافحة حشرات بالطائف
    شركة رش مبيدات بالطائف
    شركة عزل اسطح بالطائف
    شركة تسليك مجاري بالطائف
    شركة نقل اثاث بالطائف


    ReplyDelete
  9. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  10. هل تبحث عن شركة متخصصة فى خدمات التنظيف بالطائف بافضل المعدات والسوائل وثقة تمة فى العمل ودقة فى النتائج كل هذه المميزت توفرها شركة الخليج الشركة الافضل والامثل فى الخدمات المنزلية بالطائف وبما اننا الشركة الافضل والامثل بدون منافس سوف نسعى لتوفر افضل الخدمات باقل تكلفة وبقدر كبير من الاهتمام والدقة عزيزى اينما كنت فى اى منطقة ا وحى تابع لمدينة الطائف اتصل بنا وسوف نصلك فى الحال شركة الخليج للخدمات المنزلية شركة تنظيف منازل بالطائف
    شركة تنظيف فلل بالطائف
    شركة تنظيف خزانات بالطائف
    شركة تسليك مجارى بالطائف
    شركة رش مبيدات بالطائف
    شركة مكافحة نمل ابيض بالطائف
    شركة مكافحة حشرات بالطائف
    شركة عزل اسطح بالطائف
    شركة عزل خزانات بالطائف

    ReplyDelete
  11. شركة السالم لخدمات التنظيف ومكافحة الحشرات ونقل العفش مع الفك والتركيب بالطائف يتم العمل لدينا من خلال فريق وعماله فنيه مدربه في غاية الاتقان ومن خلال احدث المعدات والاداوات مع شركة السالم فانت دائما في راحة تامه وامن مستمر
    شركة تنظيف بالطائف
    شركة تنظيف مجالس بالطائف
    شركة تنظيف خزانات بالطائف
    شركة مكافحة حشرات بالطائف
    شركة رش مبيدات بالطائف
    شركة عزل اسطح بالطائف
    شركة تسليك مجاري بالطائف
    شركة نقل اثاث بالطائف


    ReplyDelete
  12. نحن نمتلك مجموعة من الخبراء والمتخصصين فى شركة تنظيف بابها ونحن نستطيع التعامل مع كافة المساحات المختلفة فلا يهم ان كنت تمتلك منزل او فيلا فأن لدينا خبرات كبيرة تمكنا من تقديم خدماتنا على اكمل وجه ولدينا عمال وفنيين محترفين ولهم خبرات مختلفة نقدم ايضآ تنظيف لواجهات الشركات والفنادق. فكل ما تحتاجه من معدات واجهزة ومنظفات ذات جودة عالمية موجودة بشركتنا فنحن نسعى فقط لارضاء العميل أولآ واخيرآ

    شركة عزل خزانات بخميس مشيط
    شركة مكافحة حشرات بخميس مشيط
    شركة غسيل مجالس بخميس مشيط
    شركة غسيل خزانات المياه بخميس مشيط
    شركة غسيل خزانات بخميس مشيط
    شركة تنظيف شقق بابها

    ReplyDelete
  13. شركه مكافحه حشرات بالدمام
    شركه تنظيف منازل بالخبر
    شركه تنظيف ثريات بالدمام
    شركه نقل اثاث بالرياض
    شركه تنظيف منازل بالدمام
    شركه نقل اثاث بالدمام
    شركه تنظيف بالدمام<a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.google.com%2Fsearch%3Fsafe%3Dstrict%26client%3Dms-android-samsung%26cds%3D0%26hl%3Dar-SA%26v%3D10.83.10.21.arm%26output%3Dsearch%26q%3D%25D8%25B4%25D8%25B1%25D9%2583%25D8%25A9%2520%25D8%25AA%25D9%2586%25D8%25B8%25D9%258A%25D9%2581%2520%25D8%25AE%25D8%25B2%25D8%25A7%25D9%2586%25D8%25A7%25D8%25AA%2520%25D9%2581%25D9%2584%25D9%2584%2520%25D9%2585%25D9%2586%25D8%25A7%25D8%25B2%25D9%2584%2520%25D8%25B4%25D9%2582%25D9%2582%2520%25D8%25B9%25D9%2585%25D8%25A7%25D9%258A%25D8%25B1%2520%25D9%2588%25D9%2585%25D8%25B3%25D8%25A7%25D8%25AC%25D8%25AF%2520%25D8%25A8%25D8%25A7%25D9%2584%25D8%25B1%25D9%258A%25D8%25A7%25D8%25B6%26ludocid%3D17007661320810494960%26ibp%3Dgwp%253B0%252C7%26lsig%3DAB86z5VVY_H6TEfRlbLkmMgVDayv%26kgs%3D5e0229b308706c68%26shndl%3D-1%26source%3Dsh%252Fx%252Fkp%252Flocal%26entrypoint%3Dsh%252Fx%252Fkp%252Flocal%26fbclid%3DIwAR0usrFwg0g-4ZW60f2M6Ny_v7M19XCHIuNmxTyztaza9qLLdyjlaeWGYzA&h=AT15JeSIeMyLEHOTkQBxip-yBX7RH-pGj9y8rToycMLcYBP3_Q863Tukxryt2wf5-WQC6jZVY6BEef5ukklYzhfjN21OpJ0YMoWR3pLdEKVETQJHtILzM0DHETqsfh5NPopVJLs8wVQ6Lbk_030j

    ReplyDelete