问题描述
|
我有以下课程:
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;
}
}
但是我在modelstate中收到以下错误:
异常= {\“从类型\'System.String \'到类型\\ Models.Tag \'的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。\”}
我创建了标签活页夹,但是它不起作用,有什么想法吗?
谢谢!
解决方法
您可以将我在这里建议的模型联编程序适应于引入
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);
}
}