Как передать ошибку из TypeConverter в ошибки ModelState

Я реализовал TypeConverter для десериализации типа из строки в запросе.

Тип содержит Guid и Guid в строке, может быть недействительным, поэтому я хочу передать ошибку в ModelState.

Я пытаюсь throw new ArgumentException("my message"), и это работает, но сообщение об ошибке из исключения не передается в ModelError.ErrorMessage. Есть ли способ передать сообщение об ошибке в ModelError.ErrorMessage или я могу получить сообщение только от ModelError.Exception.Message?


person AnyName    schedule 25.02.2020    source источник
comment
Почему не ModelState.AddModelError("my-field", "error-message")?   -  person itminus    schedule 26.02.2020
comment
@itminus, где я могу это назвать? TypeConverter не имеет доступа к контроллеру ModelState   -  person AnyName    schedule 26.02.2020
comment
ModelState доступен в Controller/ActionFitler/ModelBinder. Не могли бы вы рассказать нам, как вызывается ваш TypeConverter?   -  person itminus    schedule 26.02.2020
comment
Я использую атрибут [TypeConverter(typeof(MyConverter))]   -  person AnyName    schedule 26.02.2020
comment
Я думаю, вы должны использовать ModelBinder?   -  person itminus    schedule 26.02.2020
comment
Да, я его использую, но в документах docs.microsoft.com/en-us/aspnet/core/mvc/advanced/ указывает Typically shouldn't be used to convert a string into a custom type, a TypeConverter is usually a better option, поэтому я пытаюсь его использовать :) похоже, что мой случай немного сложнее обычного, спасибо за помощь   -  person AnyName    schedule 27.02.2020


Ответы (1)


Хорошо, я вижу, что вы пытаетесь сделать.

Поскольку встроенный ModelBinder зафиксирует внутреннее исключение FormatException, чтобы установить ModelError.ErrorMessage, мы могли бы сгенерировать (или повторно сгенерировать) новое исключение FormatException. Например,

public class MyConverter : TypeConverter
{
    ...

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            try{
                ... 
                return new MyClass(x);
            }
            catch(Exception e){                 
                throw new FormatException("Ouch: sth happens");  // throw a FormatException
            }
        }
        return base.ConvertFrom(context, culture, value);
    }
    ...

Дополнительные сведения см. в разделе исходный код:

person itminus    schedule 27.02.2020
comment
Сообщение в ModelError.ErrorMessage будет правильным, но сообщение из исключения передается только в случае InputFormatterException github.com/dotnet/aspnetcore/blob/ - person AnyName; 27.02.2020