У меня есть класс, который содержит тип значения типа 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
Я ожидаю, что привязка модели будет правильно привязана к типу структуры.Тем не менее, результатом является ошибка, указывающая, что значение не может быть нулевым при попытке создать новый объект контекста проверки.