Явное приведение не работает в привязке модели по умолчанию - PullRequest
0 голосов
/ 09 марта 2010

Я использую ASP.NET MVC2 и Entity Framework.Я собираюсь немного упростить ситуацию;надеюсь, это прояснит, а не запутает!

У меня есть действие контроллера для создания адреса, и страна является справочной таблицей (другими словами, между страной иАдресные занятия).Скажем для ясности, что поле в классе Address называется Address.Land.И для целей раскрывающегося списка я получаю Country.CountryID и Country.Name.

Мне известно о Модель и проверка входных данных .Итак, если я вызываю выпадающее поле formLand - я могу заставить его работать.Но если я вызываю поле Land (то есть соответствует переменной в классе Address) - я получаю следующую ошибку:

"Преобразование параметра из типа 'System.Строка 'для типа' 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" - и он работает нормально.Однако он никогда не вызывался при публикации View.Я получаю ту же ошибку «без преобразователя типов» в модели.

Есть идеи, как намекнуть на связыватель модели, что является преобразователем типа?Спасибо

1 Ответ

2 голосов
/ 09 марта 2010

Преобразователь типов - это не то же самое, что явное или неявное преобразование, это объект, который преобразует значения между различными типами.

Я думаю, вам нужно создать класс, унаследованный от 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
{

...

}
...