显式强制转换在默认模型绑定中不起作用

时间:2010-03-08 21:15:04

标签: asp.net-mvc entity-framework casting type-conversion

我正在使用ASP.NET MVC2和Entity Framework。我将稍微简化一下情况;希望它会让它更清晰,而不是更令人困惑!

我有一个控制器动作来创建地址,而country是一个查找表(换句话说,Country和Address类之间存在一对多的关系)。让我们说清楚一点,Address类中的字段叫做Address.Land。而且,出于下拉列表的目的,我将获得Country.CountryID和Country.Name。

我知道Model vs. Input validation。所以,如果我调用下拉字段 formLand - 我可以使它工作。但是如果我调用字段 Land (即匹配Address类中的变量) - 我收到以下错误:

  

“从类型转换参数   'System.String'键入'App.Country'   失败因为没有类型转换器可以   在这些类型之间转换。“

好的,这很有道理。字符串(CountryID)来自表单,绑定器不知道如何将其转换为Country类型。所以,我写了转换器:

namespace App {
    public partial class Country {
        public static explicit operator Country(string countryID) {
            AppEntities context = new AppEntities();
            Country country = (Country) context.GetObjectByKey(
                new EntityKey("AppEntities.Countries", "CountryID", countryID));
            return country;
        }
    }
}

FWIW,我尝试了显性和隐性。我从控制器测试了它 - Country c = (Country)"fr" - 它运行正常。但是,在发布视图时,它永远不会被调用。我在模型中得到了相同的“无类型转换器”错误。

如何提示如何 类型转换器的模型绑定器? 感谢

1 个答案:

答案 0 :(得分:2)

类型转换器与显式或隐式转换不同,它是一个在不同类型之间转换值的对象。

我认为您需要创建一个继承自TypeConverter的类,该类在Country和其他类型之间进行转换,并将TypeConverterAttribute应用于您的类以指定要使用的转换器:

using System.ComponentModel;

public class CountryConverter : TypeConverter
{
    // override CanConvertTo, CanConvertFrom, ConvertTo and ConvertFrom
    // (not sure about other methods...)
}

[TypeConverter(typeof(CountryConverter))]
public partial class Country
{

...

}