Привязать сложный класс на MVC asp.net - PullRequest
0 голосов
/ 27 мая 2011

У меня есть следующие классы:

public class Movie
{
 string Name get; set;
 string Director get;  set;
 IList<Tag> Tags get; set;
}

public class Tag
{
    string TagName get; set;
}

На Действие моего контроллера я связываю так: public ActionResult Create([ModelBinder(typeof(MovieBinder))]Movie mo)

на MovieBinder я конвертирую строку в List<tag>. Это когда я отлаживаю работает.

на подшивку фильма у меня есть следующий код:

if (propertyDescriptor.Name == "Tags")
        {
            var values = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
            if (values != null)
            {
                var p = values.AttemptedValue.Replace(" ", "");
                var arrayValues = p.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                var list = new List<Tag>();
                foreach (string item  in arrayValues)
                {
                    list.Add(new Tag() { TagName = item });  
                }
                value = list;
            }
        }

Но я получаю следующую ошибку в состоянии модели: Exception = {"Преобразование параметра из типа 'System.String' в тип 'Models.Tag' завершилось неудачно, поскольку преобразователь типов не может преобразовать эти типы."}

Я создаю Папку для тегов, но она не работает, есть идеи? Спасибо!

1 Ответ

1 голос
/ 27 мая 2011

Вы можете адаптировать связующее для моделей, которое я предложил здесь , к этой новой ситуации, когда вы ввели класс Tag:

public class MovieModelBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        if (propertyDescriptor.Name == "Tags")
        {
            var values = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
            if (values != null)
            {
                return values.AttemptedValue.Split(',').Select(x => new Tag
                {
                    TagName = x
                }).ToList();
            }
        }
        return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...