Свойство только для чтения объекта BindProperty вызывается до OnPost()

#c# #razor-pages #.net-5 #asp.net-core-razor-pages

Вопрос:

У меня есть приложение Razor Pages. И моя модель страницы включает в себя следующее.

 [BindProperty] public TripSearchModel Search { get; set; }  

Когда страница опубликована, Search объект заполнен правильно.

Однако my TripSearchModel также включает свойство, доступное только для чтения IsEmpty :

 public class TripSearchModel {   // Bound properties here...   public bool IsEmpty  {  get  {  // Validate data and return true if nothing set  }  } }  

Когда страница опубликована, вызывается получатель для IsEmpty свойства. Все это происходит до OnPost() вызова обработчика.

Вот трассировка стека:

 TTRailtrax.dll!TTRailtrax.ViewModels.TripSearchModel.IsEmpty.get() Line 81 C# Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.Extensions.Internal.PropertyHelper.CallNullSafePropertyGetterlt;TTRailtrax.ViewModels.TripSearchModel, boolgt;(System.Funclt;TTRailtrax.ViewModels.TripSearchModel, boolgt; getter, object target) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.DefaultComplexObjectValidationStrategy.Enumerator.MoveNext.AnonymousMethod__1() Microsoft.AspNetCore.Mvc.Abstractions.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry.Model.get() Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.VisitChildren(Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IValidationStrategy strategy) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.VisitComplexType(Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IValidationStrategy defaultStrategy) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.VisitImplementation(ref Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, ref string key, object model) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Visit(Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, string key, object model) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Validate(Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, string key, object model, bool alwaysValidateAtTopLevel, object container) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.ObjectModelValidator.Validate(Microsoft.AspNetCore.Mvc.ActionContext actionContext, Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateDictionary validationState, string prefix, object model, Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, object container) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.EnforceBindRequiredAndValidate(Microsoft.AspNetCore.Mvc.ModelBinding.ObjectModelValidator baseObjectValidator, Microsoft.AspNetCore.Mvc.ActionContext actionContext, Microsoft.AspNetCore.Mvc.Abstractions.ParameterDescriptor parameter, Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext modelBindingContext, Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult modelBindingResult, object container) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(Microsoft.AspNetCore.Mvc.ActionContext actionContext, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder modelBinder, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider valueProvider, Microsoft.AspNetCore.Mvc.Abstractions.ParameterDescriptor parameter, Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata metadata, object value, object container) Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageBinderFactory.CreatePropertyBinder.__Bind|0(Microsoft.AspNetCore.Mvc.RazorPages.PageContext pageContext, object instance) Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.BindArgumentsCoreAsync() Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.BindArgumentsAsync() Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Next(ref Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.State next, ref Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.State next, ref Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResourceFilter() Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.State next, ref Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory.CreateRequestDelegate.AnonymousMethod__0(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Routing.dll!Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext httpContext) Microsoft.AspNetCore.Authorization.Policy.dll!Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Authentication.dll!Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Routing.dll!Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext httpContext) Microsoft.AspNetCore.StaticFiles.dll!Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.HttpsPolicy.dll!Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.dll!Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Diagnostics.dll!Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.HostFiltering.dll!Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) Microsoft.AspNetCore.Hosting.dll!Microsoft.AspNetCore.Hosting.HostingApplication.ProcessRequestAsync(Microsoft.AspNetCore.Hosting.HostingApplication.Context context) Microsoft.AspNetCore.Server.IIS.dll!Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfTlt;Microsoft.AspNetCore.Hosting.HostingApplication.Contextgt;.ProcessRequestAsync() Microsoft.AspNetCore.Server.IIS.dll!Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.HandleRequest() Microsoft.AspNetCore.Server.IIS.dll!Microsoft.AspNetCore.Server.IIS.Core.IISHttpContext.Execute() System.Private.CoreLib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()  

Кто-нибудь знает, почему свойство, доступное только для чтения, в моем [BindProperty] объекте будет вызываться страницами Razor? Или как я могу остановить это (это большой метод, и я не хочу, чтобы он работал без необходимости)?

Комментарии:

1. Может быть, вы можете зарегистрировать трассировку стека внутри этого средства получения свойств, чтобы выяснить это?

2. @Evk: Стек показывает, откуда вызывается геттер [External Code] . Так что это называется фреймворком. Я просто не знаю, почему.

3. Я думаю, вы можете отключить «только мой код» в настройках отладчика, чтобы увидеть фактическую трассировку стека.

4. @Evk: Тогда он говорит, что его вызвал Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.Extensions.Internal.PropertyHelper.CallNullSafePropertyGetterlt;TTRailtrax.ViewModels.TripSearchModel, boolgt;(System.Funclt;TTRailtrax.ViewModels.TripSearchModel, boolgt; getter, object target) . Не думаю, что это поможет.

5. Ну, теперь вы, по крайней мере, можете видеть, что это вызвано asp.net проверка модели. Что произойдет, если вы примените атрибут [ValidateNever] к этому свойству?