FormHelper icon indicating copy to clipboard operation
FormHelper copied to clipboard

Asp.net core razor desteği

Open erhan355 opened this issue 5 years ago • 1 comments

Sinan merhaba, Kütüphaneni çok beğendim, aşağıdaki yorumlarımın ,razor tarafı içinde geliştirme yapmak istersen yararlı olacağını düşünüyorum. Asp.net core razor da action filters mevcut değil onun yerine pagefilters var.Ayrıca antiforgery token kontrolü otomatik olarak yapılıyor.Bunun için hiç bir şey yapmaya gerek yok. Benim gibi Razor kullananlar için aşağıdaki filteriyi yazdım. Bunların seninde bildiğin gibi normalde scriptler dom bloklamamak adına body tag inin altına yazılır.Böyle olunca FormHelperTagHelper in eklediği script satırı daha jquery yüklenmediği $ undefined hatası veriyor.Orayı da javascript window load ile fonksiyonu ile değiştirdim.

public class FormValidatorRazor : IAsyncPageFilter
{
    public bool UseAjax { get; set; } = true;
    /// <summary>
    /// Called before the handler method executes, after model binding is complete.
    /// </summary>
    /// <param name="context"></param>
    /// <param name="next"></param>
    /// <returns></returns>
    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        if (context.HttpContext.Request.Method.Equals("POST") || context.HttpContext.Request.Method.Equals("PUT"))
        {
            var httpContext = context.HttpContext;
            var modelState = context.ModelState;


            if (UseAjax)
            {
                if (!httpContext.Request.IsAjaxRequest())
                {
                    if (context.HandlerInstance is PageModel result) //using pattern matching
                    {
                        result.Response.StatusCode = 400;
                        context.Result = result.Page();
                    }

                    await Task.CompletedTask;
                }

                if (!modelState.IsValid)
                {
                    var errorModel =
                        from x in modelState.Keys
                        where modelState[x].Errors.Count > 0
                        select new
                        {
                            key = x,
                            errors = modelState[x].Errors.
                                Select(y => y.ErrorMessage).
                                ToArray()
                        };

                    var formResult = new FormResult(FormResultStatus.Error)
                    {
                        ValidationErrors = new List<FormResultValidationError>()
                    };

                    foreach (var propertyError in errorModel)
                    {
                        if (propertyError.key == "")
                        {
                            foreach (var error in propertyError.errors)
                            {
                                formResult.Message += error;

                                if (propertyError.errors.Length > 1 && error != propertyError.errors.Last())
                                    formResult.Message += "<br>";
                            }

                            continue;
                        }

                        var errorMessage = new StringBuilder();

                        foreach (var error in propertyError.errors)
                        {
                            errorMessage.Append(error);

                            if (propertyError.errors.Length > 1 && error != propertyError.errors.Last())
                                errorMessage.Append("<br>");
                        }

                        formResult.ValidationErrors.Add(new FormResultValidationError
                        {
                            PropertyName = propertyError.key,
                            Message = errorMessage.ToString()
                        });
                    }

                    context.Result = new JsonResult(formResult);
                    return;
                }
            }
            else
            {
                var services = httpContext.RequestServices;

                var metadataProvider = services.GetService<IModelMetadataProvider>();
                var currentModel = context.HandlerInstance;

                var viewResult = new ViewResult
                {
                    ViewData = new ViewDataDictionary(metadataProvider, modelState)
                };

                viewResult.ViewData.Model = currentModel;

                context.Result = viewResult;
            }
        }
        await next.Invoke();

    }

    public async  Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
    {
        
        await Task.CompletedTask;
    }
}

erhan355 avatar Apr 23 '20 21:04 erhan355

@erhan355 Merhaba,

Olumlu yorumun ve katkın için teşekkür ederim. Bu değişiklikleri yapıp pull request gönderirsen sevinirim, başka kullananların da işine yarayacaktır. Kütüphaneye dahil edebilirim.

sinanbozkus avatar Jun 22 '20 06:06 sinanbozkus