2010-03-08 111 views
0

我正在使用ASP.NET MVC2和Entity Framework。我會稍微簡化一下情況;希望它會使它更清晰,不會更混亂!顯式轉換在默認模型綁定中不起作用

我有一個控制器操作來創建地址,國家是一個查找表(換句話說,國家和地址類之間有一對多的關係)。爲了清楚起見,Address類中的字段稱爲Address.Land。而且,出於下拉列表的目的,我得到了Country.CountryID和Country.Name。我想了解Model vs. Input validation。所以,如果我打電話給下拉字段formLand - 我可以讓它工作。但是,如果我叫場土地(即,匹配地址類變量) - 我收到以下錯誤:

"The parameter conversion from type 'System.String' to type 'App.Country' failed because no type converter can convert between these types."

OK,這是有道理的。一個字符串(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" - 它工作正常。但是,在發佈視圖時,它從不會被調用。我在模型中獲得了相同的「無類型轉換器」錯誤。

任何想法如何暗示模型聯編程序有一個類型轉換器? 謝謝

+0

我的$ 0.02:綁定查看/編輯模型,而不是實體。 – 2010-03-08 21:27:06

+0

我不會不同意 - 但我在這裏描述的下拉菜單的問題將完全相同 – Felix 2010-03-08 22:11:04

+0

不是。您的視圖模型屬性將是一個「字符串」,而不是一個實體。綁定會起作用。然後您可以使用字符串上的查詢更新實體。 – 2010-03-09 02:31:57

回答

2

類型轉換器與顯式或隱式轉換不同,它是一個在各種類型之間轉換值的對象。

我想你需要創建TypeConverterCountry和其他類型之間的轉換繼承的類,並應用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 
{ 

... 

} 
+0

哇!這是朝着正確方向邁出的巨大一步......我不知道TypeConverter。非常感謝你。我也看了微軟的HowTo:http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx 現在發生了一件有趣的事情。很明顯,EF生成CountryConverter,但它是從EntityObject派生的,顯然與TypeConverter沒有任何關係(奇怪,如果是的話)。所以,我創建了LandConverter類,用[TypeConverter(typeof(LandConverter))]裝飾了Country。 (續...) – Felix 2010-03-08 22:07:19

+0

我還沒有到達LandConverter的斷點:CanConvertFrom或LandConverter:ConvertFrom。但是,該異常聽起來有點不同: 「從類型'System.String'到類型'App.CountryConverter'的參數轉換失敗,因爲沒有類型轉換器可以在這些類型之間進行轉換。「 注意CountryConverter是生成的類,不是我的LandConverter,所以現在我更加困惑了, (hm - 每15秒只允許1條評論;) – Felix 2010-03-08 22:08:15