MVC - Невозможно привязать к обнуляемой структуре - PullRequest
0 голосов
/ 05 июля 2019

У меня есть класс, который содержит тип значения типа null.Когда я пытаюсь отправить данные в контроллер, он генерирует исключение ArgumentNullException, если данные для этой структуры существуют в запросе.

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

Классы

public class StructBindTest {        
    public TimeStruct? Time { get; set; }
}

 public struct TimeStruct {
    public int Hour { get; set; }
    public int Minute { get; set; }
}

ModelBinding

private static T BindObject<T>( Dictionary<string, object> values ) {
    var modelType = typeof( T );

    var valueProvider = new DictionaryValueProvider<object>( values, CultureInfo.CurrentCulture );
    var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType( null, modelType );
    var bindingContext = new ModelBindingContext {
        ValueProvider = valueProvider,
        ModelMetadata = modelMetadata
    };

    var con = new ControllerContext();

    var def = new DefaultModelBinder();
    var res = def.BindModel(con, bindingContext);
    if (res is T){
        return (T)res;
    }
    return default(T);
}

Main

public static void Main(){
    var values = new Dictionary<string, object> {
        {"time.hour",16},
        {"time.minute",24}                
    };
    try{
        var obj = BindObject<StructBindTest>(values);
        if(obj != null && obj.Time.HasValue){
            Console.WriteLine( "Struct Time: " + obj.Time.Value.Hour + ":" + obj.Time.Value.Minute );
        }
    }catch(Exception e){
        Console.WriteLine("Unable to bind to the time struct");
    }
}

Здесьточка-сетка, показывающая проблему https://dotnetfiddle.net/xCLalj

Я ожидаю, что привязка модели будет правильно привязана к типу структуры.Тем не менее, результатом является ошибка, указывающая, что значение не может быть нулевым при попытке создать новый объект контекста проверки.

...