2017-10-21 60 views
1

chaque fois que je connecte la validation fluide à mon application mvc asp.net core Je commence à obtenir NullReferenceException, j'ai suivi le guide d'intégration pour asp.net core sur github mais je peux Ne pas comprendre où échoue. ci-dessous est ma classe de modèle un validateur et configuration du serviceNullReferenceException lors de l'utilisation de Fluent Validation ASP.NET Core

ConfigureServices public void (services IServiceCollection) {

var appSettings = Configuration.GetSection("AppSettings"); 
    services.Configure<AppSettings>(appSettings); 


    #region FluentValidation 
    services.AddTransient<IValidator<ContactFormModel>, ContactFormValidator>(); 
    services.AddTransient<IValidator<BookingSearchViewModel>, BookingSearchModelValidator>(); 
    services.AddTransient<IValidator<BookingCarSelectionViewModel>, BookingCarSelectionValidator>(); 
    services.AddTransient<IValidator<BookingClientDataModel>, BookingClientDataValidator>(); 
    #endregion 


    services.AddMvc().AddFluentValidation(); 
    services.AddAutoMapper(typeof(Startup));  
} 

ma classe de modèle et validateur

public class BookingSearchViewModel 
    { 
    [Display(Name ="Fecha de Recogida")] 
    public DateTime? PickupDate { get; set; } 

    [Display(Name = "Fecha de Entrega")] 
    public DateTime? DropoffDate { get; set; } 

    [Display(Name = "Transmisión")] 
    public CarTransmissionEnum Transmission { get; set; } 

    public List<SelectListItem> transmissionOptions { get; set; } 

    public BookingSearchViewModel() 
    { 

     var list = new List<string> 
     { 
     "Manual", 
     "Automatico" 
     }; 

     this.transmissionOptions = new List<SelectListItem> { 
     new SelectListItem 
     { 
      Text="Manual" 
     }, 
     new SelectListItem 
     { 
      Text="Automatico" 
     } 
     }; 
    } 

    } 
    public class BookingSearchModelValidator : AbstractValidator<BookingSearchViewModel> 
    { 
    public BookingSearchModelValidator() 
    { 
     RuleFor(x => x.PickupDate).NotNull().GreaterThan(DateTime.Now).Must(FiveDaysFromToday); 
     RuleFor(x => x.DropoffDate).NotNull().GreaterThan(x => x.PickupDate).Must((form, countyId) => BeAValidRange(form.PickupDate, form.DropoffDate)); 
     RuleFor(x => x.Transmission).IsInEnum(); 
    } 

    private bool FiveDaysFromToday(DateTime? pickupDate) 
    { 
     if (pickupDate.HasValue) 
     { 
     var today = DateTimeOffset.UtcNow.Date.ToCST().DateTime; 
     var days = pickupDate.Value.Date.ToCST().Subtract(today).Days; 
     return days > 3; 
     } 
     return false; 
    } 

    private bool BeAValidRange(DateTimeOffset? pickupDate, DateTimeOffset? dropoffDate) 
    { 
     if (pickupDate.HasValue && dropoffDate.HasValue) 
     { 
     var days = dropoffDate.Value.Subtract(pickupDate.Value).Days; 
     if (days > 2 && days < 29) 
      return true; 
     } 
     return false; 
    } 

    } 

c'est la trace de la pile

NullReferenceException: Object reference not set to an instance of an object. 
FluentValidation.AspNetCore.FluentValidationClientModelValidatorProvider.CreateValidators(ClientValidatorProviderContext context) 
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.CompositeClientModelValidatorProvider.CreateValidators(ClientValidatorProviderContext context) 
Microsoft.AspNetCore.Mvc.Internal.ClientValidatorCache.GetValidators(ModelMetadata metadata, IClientModelValidatorProvider validatorProvider) 
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultValidationHtmlAttributeProvider.AddValidationAttributes(ViewContext viewContext, ModelExplorer modelExplorer, IDictionary<string, string> attributes) 
Microsoft.AspNetCore.Mvc.ViewFeatures.ValidationHtmlAttributeProvider.AddAndTrackValidationAttributes(ViewContext viewContext, ModelExplorer modelExplorer, string expression, IDictionary<string, string> attributes) 
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.AddValidationAttributes(ViewContext viewContext, TagBuilder tagBuilder, ModelExplorer modelExplorer, string expression) 
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.GenerateInput(ViewContext viewContext, InputType inputType, ModelExplorer modelExplorer, string expression, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes) 
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.GenerateTextBox(ViewContext viewContext, ModelExplorer modelExplorer, string expression, object value, string format, object htmlAttributes) 
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper.GenerateTextBox(ModelExplorer modelExplorer, string inputTypeHint, string inputType) 
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper.Process(TagHelperContext context, TagHelperOutput output) 
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper.ProcessAsync(TagHelperContext context, TagHelperOutput output) 
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner+<RunAsync>d__0.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
AspNetCore._Views_Home_Index_cshtml+<<ExecuteAsync>b__39_7>d.MoveNext() in Index.cshtml 
+ 
        <input asp-for="PickupDate" class="form-control" placeholder="mm/dd/yyyy" required type="text" /> 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext+<GetChildContentAsync>d__31.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.TagHelpers.RenderAtEndOfFormTagHelper+<ProcessAsync>d__7.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner+<RunAsync>d__0.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
AspNetCore._Views_Home_Index_cshtml+<ExecuteAsync>d__39.MoveNext() in Index.cshtml 
+ 
    var pixelImage = appSettings.Value.PixelImage; 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderPageCoreAsync>d__16.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderPageAsync>d__15.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Razor.RazorView+<RenderAsync>d__14.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor+<ExecuteAsync>d__22.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor+<ExecuteAsync>d__21.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.ViewResult+<ExecuteResultAsync>d__26.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeResultAsync>d__19.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResultFilterAsync>d__24.MoveNext() 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResourceFilter>d__22.MoveNext() 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeFilterPipelineAsync>d__17.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeAsync>d__15.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext() 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext() 

c'est ainsi que je Suis l'exécution de la vue

public IActionResult Index() 
    { 
     var model = new BookingSearchViewModel(); 
     return View(model); 
    } 

J'ai essayé de supprimer les propriétés nullables dans le modèle, les initialiser, en supprimant les règles de validation, mais je reçois toujours la même erreur, j'utilise FluentValidation.AspNetCore v7.2.0.

Comment puis-je corriger cette exception nulle?

** Edit:

est pas un doublon, est lié à Fluent Validation et je pense l'exception se produit lorsque la validation Injecter Courant dans le noyau de asp.net, aucun de mes modèles sont nuls, en supprimant le AddFluentValidation () des services supprime l'erreur, mais je ne peux pas utiliser la validation couramment plus **

de Merci

+1

double possible de [Qu'est-ce qu'un NullReferenceException, et comment puis-je résoudre ce problème?] (Https://stackoverflow.com/questions/ 4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

n'est pas un doublon, est lié à Fluent Validation et je suppose que l'exception se produit lors de la validation Injecting Fluent dans le noyau asp.net, aucun de mes modèles est nul, enlever le AddFluentValidation() des services enlève l'erreur mais alors je ne peux pas utiliser la validation courante pas plus –

Répondre

0

Je ne sais pas si vous avez besoin de validation côté client sur votre application particulière, mais je réussi à régler ce problème par désactivation de la validation côté client (après avoir lu le journal des problèmes de validation de fluidité here)

Le code que j'utilise dans mon démarrage est: -

services.AddMvc().AddFluentValidation(fv => 
{  
    fv.ConfigureClientsideValidation(enabled: false); 
}); 
+0

Salut, est-ce déjà signalé dans github? – dpp

+0

Désolé je ne suis pas sûr, le lien que j'ai fourni est un problème signalé par quelqu'un d'autre qui avait le même problème que moi après la mise à jour vers la version 7.2.0. Il n'est pas clair si cette 'solution' est la nouvelle façon de configurer FV (ce qui ressemble en quelque sorte) ou juste un paramètre pour arrêter ce problème que certaines personnes ont ... – padigan