Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Asp.net core razor desteği #12

Open
erhan355 opened this issue Apr 23, 2020 · 1 comment
Open

Asp.net core razor desteği #12

erhan355 opened this issue Apr 23, 2020 · 1 comment
Labels
enhancement New feature or request good first issue Good for newcomers

Comments

@erhan355
Copy link

erhan355 commented Apr 23, 2020

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.<script>window.addEventListener('load',function () {{$('#{formId}').UseFormHelper()

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;
    }
}
@sinanbozkus sinanbozkus added enhancement New feature or request good first issue Good for newcomers labels Jun 1, 2020
@sinanbozkus
Copy link
Owner

@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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

2 participants