Edycja: Dodano Bounty dlatego szukam rozwiązania MVC3 (jeśli taki istnieje), inne niż to:Dlaczego środowisko ASP.NET MVC dba o moje właściwości tylko do odczytu podczas wiązania danych?
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
mam właściwość tylko do odczytu na moim „Adres” modelu 'CityStateZip'
.
To wygodny sposób na uzyskanie miasta, stanu, zip z adresu w USA. Zgłasza wyjątek, jeśli kraj nie jest USA (dzwoniący powinien najpierw sprawdzić).
public string CityStateZip
{
get
{
if (IsUSA == false)
{
throw new ApplicationException("CityStateZip not valid for international addresses!");
}
return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
}
}
To jest część mojego modelu, więc jest związana. Przed ASP.NET MVC2 RC2 to pole nigdy nie powodowało problemu podczas wiązania danych. Nigdy nawet o tym nie myślałem - w końcu jest tylko do odczytu.
Teraz z wydaniem RC2 z stycznia 2010 r. Daje mi błąd podczas wiązania danych - ponieważ domyślny model spoiwa wydaje się chcieć sprawdzić tę wartość (nawet jeśli jest to tylko odczyt).
Jest to linia "base.OnModelUpdated", która powoduje wyzwolenie tego błędu.
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
Ostatnio minut zmienia się na modelbinder widocznie spowodowało tę zmianę w zachowaniu - ale nie jestem pewien, ale to, co z niego repurcussions są - lub czy nie jest to problem? Przekażę to zespołowi MVC, ale jestem ciekawy, czy ktokolwiek inny ma w międzyczasie jakieś sugestie, jak mogę zapobiec związaniu tej właściwości.
Ten artykuł jest wart przeczytania o zmianach - ale w ogóle nie wspomina o właściwościach readonly (nie, żebym się tego spodziewał). Kwestia (jeśli taka istnieje) może być szersza niż ta sytuacja - po prostu nie jestem pewna jakiejkolwiek repruzji - jeśli w ogóle!
Input Validation vs. Model Validation in ASP.NET MVC
Zgodnie z wnioskiem @haacked oto StackTrace:
uzyskać to poprzez dodanie następującej linii do każdego modelu i przygotowanie stanowiska do odpowiedniej metody działania. W tym przypadku dodałem go do mojego najprostszego możliwego modelu.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException: dostępowe Właściwość "Foo na cel 'Rolling_Razor_MVC.Models.ContactUsModel' wyrzucił następujące wyjątki: 'bar'] System.ComponentModel.ReflectPropertyDescriptor.GetValue (Component Object) + 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. < Sprawdź poprawność > d__5.MoveNext() +644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated (ControllerContext controllerContext, ModelBindingContext BindingContext) +92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext BindingContext model obiektu) +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 (model TModel, przedrostek String , String [] includeProperties, String [] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel (model TModel) +73
Co jest dokładny błąd, który widzisz? Byłoby również pomocne zobaczyć odpowiedni kontroler i kod widoku. –
Potrzebujemy więcej szczegółów, ale domyślam się, że IsUsa jest fałszywa, gdy próbujemy odczytać tę właściwość, co powoduje, że wyjątek zostanie rzucony. Nie wiem, dlaczego czytaliśmy go podczas wiązania modelu, chyba że w formularzu, który jest wysyłany, znajduje się pole formularza o nazwie "CityStateZip". – Haacked
@brad również dokładny błąd to "CityStateZip nie jest poprawny dla adresów międzynarodowych!" ;-) Aktualizuję pytanie za pomocą pełnego śledzenia stosu. duplikować, po prostu dodaj to do KAŻDEGO istniejącego modelu i zrób POST do odpowiedniego actionmethod: public string Foo {get {throw new Exception ("bar"); }} –