Редактировать: Добавлена награда, потому что я ищу решение MVC3 (если оно существует), отличное от этого:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
У меня есть свойство только для чтения в моей модели 'Адрес' 'CityStateZip'
.
Это просто удобный способ получить город, штат, почтовый индекс с адреса США. Выдает исключение, если страна не США (вызывающий должен сначала проверить).
public string CityStateZip
{
get
{
if (IsUSA == false)
{
throw new ApplicationException("CityStateZip not valid for international addresses!");
}
return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
}
}
Это часть моей модели, поэтому она становится связанной. До ASP.NET MVC2 RC2 это поле никогда не вызывало проблем при привязке данных. Я никогда даже не задумывался об этом - в конце концов, это только для чтения.
Теперь, несмотря на то, что в выпуске RC2 от января 2010 г. он выдает ошибку при привязке данных - поскольку связыватель модели по умолчанию хочет проверить это значение (даже если он доступен только для чтения).
Это строка base.OnModelUpdated, которая вызывает эту ошибку.
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
Последние изменения в связывателе модели, очевидно, вызвали это изменение в поведении - но я пока не совсем уверен, каковы его последствия - или это ошибка? Я передаю это команде MVC, но любопытно, если у кого-то еще есть какие-либо предложения, как я могу предотвратить привязку этого свойства.
Эту статью стоит прочитать об изменениях, но вообще не упоминаются свойства только для чтения (не то, чтобы я этого ожидал). Проблема (если таковая имеется) может быть шире, чем эта ситуация - я просто не уверен в каких-либо рецидивах - если таковые имеются!
Проверка входных данных и проверка модели в ASP.NET MVC
В соответствии с запросом @haacked, вот трассировка стека:
Я получаю это, просто добавив следующую строку в ЛЮБУЮ модель и сделав запись в соответствующем методе действия. В этом случае я добавил его в свою простейшую модель.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException: средство доступа к свойству 'Foo' для объекта 'Rolling_Razor_MVC.Models.ContactUsModel' выдало следующее исключение: 'bar']
System.ComponentModel.ReflectPropertyDescriptor.GetValue (компонент объекта) +390
System.Web.Mvc. <> C__DisplayClassb. b__a () +18
System.Web.Mvc.ModelMetadata.get_Model () +22
System.Web.Mvc.ModelMetadata.get_RealModelType () +29
System.Web.Mvc. d__0.MoveNext () +38
System.Linq. d__14`2.MoveNext () +273
System.Web.Mvc. d__5.MoveNext () +644
System.Web.Mvc.DefaultModelBinder.OnModelUpdated (ControllerContext controllerContext, ModelBindingContext bindingContext) +92
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, объектная модель) +60
System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +1048
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +280
System.Web.Mvc.Controller.TryUpdateModel (модель TModel, префикс String, String [] includeProperties, String [] excludeProperties, IValueProvider valueProvider) +449
System.Web.Mvc.Controller.TryUpdateModel (модель TModel) + 73