Почему ASP.NET MVC заботится о моих свойствах только для чтения во время привязки данных?

Изменить: Добавлена ​​награда, потому что я ищу решение 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. <GetPropertyValueAccessor> b__a () +18 System.Web.Mvc.ModelMetadata.get_Modec.eb.Modec. + (+) (+) ModelMetadata.get_RealModelType () +29 System.Web.Mvc. <GetValidatorsImpl> d__0.MoveNext () +38 System.Linq. <SelectManyIterator> d__14`2.MoveNext () +273 System.Web.Mvc. <Validate> MoveNext () +644 System.Web.Mvc.DefaultModelBinder. DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +1048 System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, привязка ModelBindingContext, связываниеContext) +280 System.Web.ModelIp ix, String [] includeProperties, String [] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel (модель TModel) +73

Ответы на вопрос(7)

Ваш ответ на вопрос