Как вы используете новые классы ModelBinder в ASP.NET MVC Preview 5 - PullRequest
2 голосов
/ 29 августа 2008

Вы заметите, что 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}
    }
}

Ответы [ 2 ]

2 голосов
/ 29 августа 2008

Ну, я посмотрел на это. 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());
1 голос
/ 03 сентября 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...