كيف يمكنك استخدام فئات ModelBinder الجديدة في ASP.NET MVC Preview 5

StackOverflow https://stackoverflow.com/questions/34709

  •  09-06-2019
  •  | 
  •  

سؤال

ستلاحظ أن Preview 5 يتضمن ما يلي في ملاحظات الإصدار:

تمت إضافة دعم لمجلدات النماذج المخصصة.تسمح لك المجلدات المخصصة بتعريف الأنواع المعقدة كمعلمات لأسلوب العمل.لاستخدام هذه الميزة، قم بوضع علامة على النوع المعقد أو تعريف المعلمة باستخدام [ModelBinder(...)].

إذًا كيف يمكنك استخدام هذه الميزة فعليًا حتى أتمكن من الحصول على شيء مثل هذا في وحدة التحكم الخاصة بي:

public ActionResult Insert(Contact contact)
{
    if (this.ViewData.ModelState.IsValid)
    {
        this.contactService.SaveContact(contact);

        return this.RedirectToAction("Details", new { id = contact.ID}
    }
}

نصائح أخرى

حسنا لقد بحثت في هذا.يوفر ASP.NET موقعًا مشتركًا لتسجيل تطبيق IControlBinders.لديهم أيضًا أساسيات العمل عبر طريقة Controller.UpdateModel الجديدة.

لذلك قمت بدمج هذين المفهومين بشكل أساسي عن طريق إنشاء تطبيق IModelBinder الذي يفعل نفس الشيء مثل Controller.UpdateModel لجميع الخصائص العامة لـ modelClass.

public class ModelBinder : IModelBinder 
{
    public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
    {
        object model = Activator.CreateInstance(modelType);

        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(model);
        foreach (PropertyDescriptor descriptor in properties)
        {
            string key = modelName + "." + descriptor.Name;
            object value = ModelBinders.GetBinder(descriptor.PropertyType).GetValue(controllerContext, key, descriptor.PropertyType, modelState);
            if (value != null)
            {
                try
                {
                    descriptor.SetValue(model, value);
                    continue;
                }
                catch
                {
                    string errorMessage = String.Format("The value '{0}' is invalid for property '{1}'.", value, key);
                    string attemptedValue = Convert.ToString(value);
                    modelState.AddModelError(key, attemptedValue, errorMessage);
                }
            }
        }

        return model;
    }
}

في Global.asax.cs الخاص بك، ستحتاج إلى إضافة شيء مثل هذا:

    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top