Hola chicos, estoy tratando de validar una entrada usando Ajax / Jquery discreto. Pero, después de que ModelState no es válido, no sé cómo tratar la devolución de la llamada ajax y cómo mostrar el 'texto requerido / expresión regular' en la etiqueta asp-validatation-for. ¿Alguien puede ayudar?

En mi .cshtml:

<label class="control-label">CodCard</label>
<input asp-for="CodCard" type="text" class="form-control small col-4" />
<span asp-validation-for="CodCard" class="text-danger"></span>

En mi ViewModel:

[Required(ErrorMessage = "{0} must not be empty.")]
[Display(Name = "Code card")]
[StringLength(4, MinimumLength = 3, ErrorMessage = "Must be between {2} and {1} characters.")]
[RegularExpression("^[0-9]*$", ErrorMessage = "Must have only numbers.")]
public string CodCard { get; set; }

En mi .js:

    $(function () {
        $("#btnChk").click('show.bs.modal', function () {
            var options = {};
            options.type = "POST";
            options.url = "/api/CheckOut";
            options.dataType = "JSON";
            options.cache = false;
            options.async = true;
            contentType = "application/json; charset=utf-8",
            options.data = {
                "IdOrder": $("#IdOrder").val(),
                "CodCard": $("#CodCard").val()
            };

            options.beforeSend = function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
            };
        
            options.success = function (data) {
            if (!data.success) {
                if (data.errors.length > 0) {
                    
                    
                    // I supposed to do something here, I am right?? But How? 

                    //for (var i = 0; i < response.errors.length; i++) {
                    //    var error = response.errors[i];
                    //    alert(error);
                    //}

                }
            }
            else
            {
                if (data.IdOrder!= null) {
                    window.location.href = "/app/order/order?Id=" + data.IdOrder;
                }

                // Error 
                if (data.errors == "fail") {
                    var modal = $("#itemLoader");
                    modal.find('.modal-body .spinner-border').hide();
                    modal.find('.modal-body .far').show();
                }
            }
        };
        options.error = function () {
            $('.alertMsg').html("Error while making Ajax call!");
        };
        $.ajax(options);
    });
});

Mi clase de controlador:

     [HttpPost("/api/CheckOut")]
     public async Task<IActionResult> CheckOut([Bind("IdOrder, CodCard")] BagCheckOutViewModel checkOut)
     {
           ...
    
        if (!ModelState.IsValid)
        {   
                  return Json(new { success = false, errors = ModelState.Values.Where(i => i.Errors.Count > 0) });
        }

          ...
0
Guto Barroso 26 oct. 2020 a las 20:34

1 respuesta

La mejor respuesta

Aquí hay una demostración funcional sobre cómo mostrar el error de estado del modelo después de la publicación de ajax:

Ver (Privacy.cshtml):

@model BagCheckOutViewModel 
<div id="myform">
    <form>
        <div>
            <label class="control-label">CodCard</label>
            <input asp-for="CodCard" type="text" class="form-control small col-4" />
            <span asp-validation-for="CodCard" class="text-danger"></span>
        </div>
        <div>
            <label class="control-label">IdOrder</label>
            <input asp-for="IdOrder" type="text" class="form-control small col-4" />
            <span asp-validation-for="IdOrder" class="text-danger"></span>
        </div>
        <div>
            <input type="button" id="btnChk" value="click" />
        </div>
    </form>
</div>

Guiones:

@section Scripts
{
    <script type="text/javascript">
          $(function () {
            $("#btnChk").click('show.bs.modal', function () {
                var options = {};
                options.type = "POST";
                options.url = "/api/CheckOut";
                options.dataType = "JSON";
                options.cache = false;
                options.async = true;
                contentType = "application/json; charset=utf-8",
                options.data = {
                    "IdOrder": $("#IdOrder").val(),
                    "CodCard": $("#CodCard").val()
                };

                options.beforeSend = function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
                };

                options.success = function (data) {
                    //do your stuff...
            
            };
                options.error = function (res) {
                    $('#myform').html(res.responseText); //change here...
            };
            $.ajax(options);
        });
    });
    </script>
}

Controlador:

[HttpPost("/api/CheckOut")]
public async Task<IActionResult> CheckOut([Bind("IdOrder, CodCard")] BagCheckOutViewModel checkOut)
{

    if (!ModelState.IsValid)
    {
        return PartialView("Privacy",checkOut);
    }
    return Json(new { success = true});
}

Resultado: ingrese la descripción de la imagen aquí

1
Rena 27 oct. 2020 a las 02:41