نویسار

یادداشت های یک برنامه نویس وب

نویسار

یادداشت های یک برنامه نویس وب

نویسار

اینجا صرفا محلی برای یاداشتها و بیان تجربه های شخصی صاحب وبلاگ می باشد.

پیوندهای روزانه

۳ مطلب با کلمه‌ی کلیدی «mvc 4» ثبت شده است

اگر با mvc کار کرده باشید حتما با ModelBinding آن آشنا هستید؛ DefaultModelBinder توکار آن که در اکثر مواقع، باری زیادی را از روی دوش برنامه نویسان بر می داردو کار را برای آنان راحتتر می کند، اما در بعضی مواقع این مدل بایندر پیش فرض ممکن است پاسخگوی نیاز ما در بایند کردن یک خصوصیت از یک مدل خاص نباشد، برای همین ما نیاز داریم که کمی اون رو سفارشی سازی کنیم.

برای این کار ما دو راه داریم:

1) یک مدل بایندر جدید با پیاده سازی از IModelBinder انجام دهیم. (در این حالت ما مجبوریم که مدل بایندر رو از اول جهت بایند کردن کلیه مقادیر شی مدل مون بازنویسی کنیم و در واقع امکان انتساب اون رو در سطح فقط یک خصوصیت نداریم.) (نحوه پیاده سازی قبلا در اینجا مطرح شده)

2) ModelBinder پیش فرض رو جهت پاسخگویی به نیازمون توسعه بدیم. (که در این مطلب قصد آموزشش رو داریم.)

 

فرض کنید که می خواهید از روی یک Enum در صفحه، یک DropDown معادل رو قرار بدید که به طور خودکار رشته انتخاب شده رو به یک خصوصیت مدل که از نوع بایت هست بایند بکند.

از طریق کد زیر یک DropDownFor برای Enum مورد نظر در مدل ایجاد کنیم:

@Html.DropDownListFor(model => model.AccountType, new SelectList(Enum.GetNames(typeof(Enums.AccountType))))

و کلاس Enum مورد نظر :

public enum AccountType : byte
{
   مدیر = 0,
   کاربر_حقیقی = 1,
   کاربر_حقوقی = 2,
}

حالا برای اینکه این مقدار انتخابی به صورت خودکار و از طریق امکان binding توکار خود MVC به خصوصیت AccountType مقدار دهی شود باید یک PropertyBindAttribute سفارشی بنویسیم، برای اینکار یک کلاس جدید با نام CustomBinding می سازیم و کدهای زیر رو به اون اضافه می کنیم :

namespace MvcApplication1.Models
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public abstract class PropertyBindAttribute : Attribute
    {
        public abstract bool BindProperty(ControllerContext controllerContext,
        ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor);
    }

    public class ExtendedModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext,
            ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.Attributes.OfType<PropertyBindAttribute>().Any())
            {
                var modelBindAttr = propertyDescriptor.Attributes.OfType<PropertyBindAttribute>().FirstOrDefault();

                if (modelBindAttr.BindProperty(controllerContext, bindingContext, propertyDescriptor))
                    return;
            }

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

در کد بالا ما تمام کلاس هایی رو که از PropertyBindAttribute مشتق شده باشند رو به DefaultModelBinder اضافه می کنیم. این کد فقط یک بار نوشته می شود و از این به بعد هر بایندر سفارشی که بسازیم به بایندر پیشفرض اضافه خواهد شد.

حالا از طریق کد های زیر، ما بایندرِ سفارشیِ خصوصیتِ خودمون رو به کلاس اضافه می کنیم :

    public class AccountTypeBindAttribute : PropertyBindAttribute
    {
        public override bool BindProperty(ControllerContext controllerContext,
            ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.PropertyType == typeof(byte))
            {
                HttpRequestBase request = controllerContext.HttpContext.Request;

                byte accountType = (byte)Enum.Parse(typeof(Enums.Enums.AccountType), request.Form["AccountType"]);
                propertyDescriptor.SetValue(bindingContext.Model, accountType);

                return true;
            }
            return false;
        }
    }

در کد بالا ما مقدار رشته ای رو که از DropDown ارسال شده را به مقدار عددی متناظر تعریف شده آن در Enum تبدیل می کنیم و آن را به خصوصیت مورد نظر بازگشت می دهیم، از این به بعد فقط برای فیلدی که به شکل زیر نشانه گذاری شده باشد ما از این کلاس بایندر سفارشی استفاده می کنیم و مدل بایندر پیش فرض هم کار خود را خواهد کرد و بقیه مقادیر را بایند خواهد کرد » اطلاعات بیشتر

[AccountTypeBindAttribute]
public byte AccountType { get; set; }

حالا باید این کلاس گسترش یافته ModelBinder رو به عنوان بایندر پیش فرض mvc قرار بدهیم، برای اینکار کد زیر را به فایل Global.asax.cs اضافه کنید:

ModelBinders.Binders.DefaultBinder = new ExtendedModelBinder();

کار ما دیگه تمومه و تا اینجای کار همه چی بدرستی کار می کنه ... تا اینکه شما تصمیم میگیری که از jquery.validate.unobtrusive برای اعتبار سنجی سمت کاربر استفاده کنید و می بینید به DropDown شما هم ایراد میگیره که حتما باید از نوع عددی باشد

The field نوع کاربر : must be a number.

برای حل این مشکل هم باید به صورت دستی validation سمت کاربر رو برای این DropDown غیرفعال کرد، که باید کدهای DropDownFor که در صفحه گذاشتید رو به شکل زیر تغییر بدید:

@Html.DropDownListFor(model => model.AccountType, new SelectList(Enum.GetNames(typeof(Enums.AccountType))),new Dictionary<string, object>() {{ "data-val", "false" }})

 

 

۲ نظر موافقین ۱ مخالفین ۰ ۲۵ آبان ۹۲ ، ۱۳:۵۴
محمد رعیت پیشه

Highcharts.js یک کتابخانه رسم نمودار نوشته شده با جاوااسکریپت  و HTML5 هست که به شما این امکان رو می دهد که در وب سایت یا وب اپلیکیشن خود از نمودار های تعاملی و بصری زیبا و جذاب استفاده کنید.

این کتابخانه یکی از بهترین ابزارها برای رسم نمودار های مدرن با رابط تعاملی جاوااسکریپت  هست که قابلیت های بسیار و انعطاف پذیری بالایی در تغییر اجزای مختلف اون وجود دارد. تقریبا خصوصیتی در اون وجود نداره که نشه تغییرش نداد و این بسیار عالیه.

دارای 5 تم آماده نوشته شده در جاوااسکریپت  هست و می توان آن را در کنار Jquery و MooTools هم استفاده کرد.

در حال حاضر این کتابخانه از 18 نوع نمودار از قبیل:خطی، ستونی، میله ای، حبابی، کیکی، پراکنده، ناحیه ای و ... پشتیبانی می کند و در زیر بعضی از مشتری های این کتابخانه آمده اند.

IBM, NASA, Siemens, HP, EMC, CBS, Hitachi, Ericsson, BMW, Nissan, Sony, Fujitsu, Citi, Rabobank, RIM, BBC

 

مشاهده وب سایت Highchart

 

 

۳ نظر موافقین ۱ مخالفین ۰ ۰۸ تیر ۹۲ ، ۲۰:۴۴
محمد رعیت پیشه

Building Applications with ASP.NET MVC 4

سری فیلم های آموزشی Scott Allen  در سابت PluralSight که بعضی از اونها نیازمند ثبت نام و خریده شدن هستند اما این دوره از آموزش MVC4 به صورت رایگان در سایت قرار گرفته که در ادامه می تونید اونو از خود سایت تماشا و دانلود کنید.

این دوره مقدمه ای جامع بر ASP.NET MVC4 می باشد و به شما هر آنچه که برای شروع لازم دارید رو آموزش میدهد.

سرفصل های این دوره :

  •   Introduction to ASP.NET MVC 4
  • Controllers in ASP.NET MVC 4
  • Razor Views
  • Working With Data (Part I)
  • Working With Data (Part II)
  • AJAX and ASP.NET MVC
  • Security and ASP.NET MVC 4
  • ASP.NET MVC 4 Infrastructure
  • Unit Testing with ASP.NET MVC 4
  • Deployment and Configuration

برای مشاهده و یا دانلود به این لینک مراجعه نمائید

۱ نظر موافقین ۲ مخالفین ۰ ۰۵ خرداد ۹۲ ، ۲۱:۰۶
محمد رعیت پیشه