편집 : (있는 경우) 내가 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 이전에는이 필드가 데이터 바인딩 중에 문제를 일으키지 않았습니다. 나는 그것에 대해 정말로 생각조차하지 못했습니다. 결국 그것은 오직 읽기 전용입니다.
지금 2010 년 1 월 RC2 출시와 함께 나에게 데이터 바인딩 중에 오류 제공하지만 - 기본 모델 바인더를 변경할 수 없기를 (이 읽기 전용 되더라도)이 값을 검사 할 것으로 보인다.그것은이 오류를 발생시키는 'base.OnModelUpdated'라인은 트리거 될 것입니다.
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
마지막 분은 분명히 행동의 변화를 일으킨 ModelBinder를로 변경 -하지만 난 아직 그것의 repurcussions이 무엇인지 확실히 모르겠어요 - 또는 여부 이것은 버그가? 나는 이것을 MVC 팀에 전달하지만, 그 사이에 누군가가 어떤 제안을 가지고 있다면이 속성이 바인딩되지 못하도록 막을 수 있는지 궁금 할 것입니다.
이 문서
은 변화를 읽을 가치가있다 -하지만 (나는 그것에을 기대하지 않는 것이) 모두에서 읽기 전용 특성을 언급하지 않습니다. 이 문제 (이 경우)가이 상황보다 더 광범위 할 수 있습니다 - 나는 어떤 반향에 대해서도 확신 할 수 없습니다 - 만약 있다면!단순히 어떤 모델에 다음 행을 추가하고 해당 조치 방법에 게시물을하여 얻을 : 여기 @haacked의 요청에 따라
Input Validation vs. Model Validation in ASP.NET MVC
는 스택 트레이스입니다. 이 예에서는 가능한 가장 단순한 모델에 추가했습니다.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException : 오브젝트 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
입니다 Global.asax.cs 다음 추가해야합니다 문제
피해 갈 내 솔루션에 다음과 같은 모델 메타 데이터 공급자를 추가 정확한 오류는보고 있습니까? 관련 컨트롤러 및보기 코드를 보는 것도 도움이됩니다. –
더 자세한 정보가 필요하지만 예외가 발생하도록 해당 속성을 읽으려고하면 IsUsa가 false가됩니다. 그러나 게시되는 양식에 "CityStateZip"이라는 양식 필드가없는 한 모델 바인딩 중에 왜 책을 읽는지 확신 할 수 없습니다. – Haacked
@brad 음, 정확한 오류는 'CityStateZip이 국제 주소로 유효하지 않습니다!'입니다. ;-) 전체 스택 추적으로 질문을 업데이트하고 있습니다. 복제하려면 기존 모델에 추가하고 해당 조치 메소드에 POST하십시오. public string Foo {get {throw new Exception ("bar"); }} –