Изменить: добавлена баунти, потому что я ищу решение 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);
Последние изменения в modbinder, видимо, вызвали это изменение в поведении - но я еще не совсем уверен, что это за последствия - или это ошибка? Я передаю это команде MVC, но любопытно, есть ли у кого-либо другие предложения, тем временем, как я могу предотвратить привязку этого свойства.
В этой статье стоит прочитать об изменениях - но не упоминает свойства readonly вообще (не то, что я ожидал бы от нее). Проблема (если таковая есть) может быть шире этой ситуации - я просто не уверен в каких-либо повторениях - если есть!
Проверка ввода и проверка модели в ASP.NET MVC
В соответствии с запросом @haacked здесь stacktrace:
Я получаю это, просто добавив следующую строку в ЛЮБОЙ модель и сделав сообщение соответствующему методу действия. В этом случае я добавил его к моей самой простой возможной модели.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException: свойство accessor 'Foo' на объекте 'Rolling_Razor_MVC.Models.ContactUsModel' выбрасывает следующее исключение: 'bar'] System.ComponentModel.ReflectPropertyDescriptor.GetValue(компонент объекта) +390 System.Web.Mvc. < gt; c__DisplayClassb. <GetPropertyValueAccessor> b__a() +18 System.Web.Mvc.ModelMetadata.get_Model() +22 System.Web.Mvc.ModelMetadata.get_RealModelType() +29 System.Web.Mvc. <GetValidatorsImpl> d__0.MoveNext() +38 System.Linq. <SelectManyIterator> d__14`2.MoveNext() +273 System.Web.Mvc. <Validate> d__5.MoveNext() +644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +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