Edit: Добавлено Баунти, потому что я ищет решение MVC3 (если таковой существует), кроме этого:Почему ASP.NET MVC заботится о моих свойствах только для чтения во время привязки данных?
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = ложь;
У меня есть свойство только для чтения на моей модели '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);
Последние минуты изменения в ModelBinder, очевидно, вызвано это изменение в поведении - но я не совсем уверен, но то, что repurcussions его являются - или действительно ли это ошибка? Я передаю это команде MVC, но любопытно, есть ли у кого-либо еще какие-либо предложения, тем временем я могу предотвратить привязку этого свойства.
В этой статье стоит прочитать об изменениях, но совсем не упоминает свойства readonly (не то, что я ожидал бы от них). Проблема (если таковая существует) может быть шире этой ситуации - я просто не уверен в каких-либо переписях - если они есть!
Input Validation vs. Model Validation in ASP.NET MVC
В соответствии с просьбой @haacked вот StackTrace:
Я получаю это, просто добавив следующую строку в любой модели и сделать запись в соответствующий метод действия. В этом случае я добавил его к моей самой простой возможной модели.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException: Свойство аксессор 'Foo' на объекте 'Rolling_Razor_MVC.Models.ContactUsModel' бросили следующее исключение: 'бар'] System.ComponentModel.ReflectPropertyDescriptor.GetValue (компонент объекта) + 390 System.Web.Mvc. < > 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. < Подтвердить > 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 [] includeProperties, String [] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel (модель TModel) +73
Что такое точную ошибку, которую вы видите? Было бы также полезно увидеть соответствующий контроллер и просмотреть код. –
Нам нужно больше деталей, но я предполагаю, что IsUsa является ложным, когда мы пытаемся прочитать это свойство, которое вызывает исключение. Не уверен, почему мы будем читать его во время привязки к модели, хотя, если в форме, которая публикуется, есть поле формы с именем «CityStateZip». – Haacked
@brad хорошо точная ошибка: «CityStateZip недействителен для международных адресов!» ;-) Я обновляю вопрос с помощью полной трассировки стека. Чтобы дублировать, просто добавьте это в ЛЮБЮЮ существующую модель, и у вас есть POST к соответствующему методу действия: public string Foo {get {throw new Exception ("bar"); }} –