Опубликовать метод с ajax и jquery в MVC - PullRequest
0 голосов
/ 25 мая 2018

Я хочу ввести значения в мою таблицу «Категории», чтобы не перезагружать страницу и держать пользователя всегда на виду, для этого я хочу использовать Ajax + Jquery, упражнение кажется простым, но оно сводит меня с ума, вы вводите названия категорий во входе и хотите показать <div> для вашего подтверждения (успех) или неудачи (опасность) в зависимости от случая, что-то вроде этого ...

CrearCategoria

Проблема в том, что мой код Javascript ничего не делает, он даже не входит в метод Create

Я прилагаю свое представление create.html:

 <head>  
        <script src="~/Scripts/jquery-1.12.4.js"></script>
        <script src="~/Scripts/jquery-1.12.4.min.js"></script>

</head>
 <body>
                <div id="div-alerta">
                    <label id="mensaje-alerta"></label>
                </div>

                <hr />             
                    @Html.LabelFor(model => model.v_Nombre, htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        <input class="form-control" type="text" id="txtNombre" />

                    </div>

                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">               
                        <input type="button" value="Crear" id="btnCrearCategoria" class="btn btn-outline-success btn-lg" />
                    </div>
                </div>
  </body>
  </html>

            @section Scripts {
                @Scripts.Render("~/bundles/jqueryval")

              <script>
                  $(function () {
                      $("#btnCrearCategoria").click(function () {

                          var url = "@Url.Action("Create", "Categorias")";
                          var nombre = $("#txtNombre").val();
                          var data = { v_Nombre: nombre };

                          $.post(url, data).done(function (data) {
                              if (data.Ok) {
                                  $("#div-alerta").removeClass("alert-danger").addClass("alert-success").slideDown(100);
                              }
                              else {
                                  $("div-alerta").removeClass("alert-success").addClass("alert-danger").slideDown(100);
                              }

                              $("#mensaje-alerta").html(data.Mensaje)
                          })
                      })
                  })
        </script>

            }

Это мой объект category.cs:

  public class Categoria
        {
            [Key]
            public int Kn_CodigoCategoria { get; set; }

            [Required(ErrorMessage = "El campo {0} es obligatorio")]
            [MaxLength(40, ErrorMessage = "El campo {0} debe tener un máximo de {0} caracteres")]
            [Column(TypeName = "VARCHAR")]
            [Index("Categoria_v_Nombre_Index", IsUnique = true)]
            [Display(Name = "Nombre Categoria")]
            public string v_Nombre { get; set; }
        }

, и это мой метод создания, который возвращает Json:

       [HttpPost]
            [ValidateAntiForgeryToken]
            public JsonResult Create(Categoria categoria)
            {
                var resultado = new BaseRespuesta();

                try
                {
                       db.Categorias.Add(categoria);
                       db.SaveChanges();

                    resultado.Mensaje = "Categoria creada correctamente";
                    resultado.Ok = true;
                }
                catch (Exception ex)
                {
                    resultado.Mensaje = ex.Message;
                    resultado.Ok = false;
                }

                return Json(resultado);
       }

Я занимаю класс BaseResponse для просмотра сообщенийоб успешном или неудачном выполнении моей операции:

 public class BaseRespuesta
    {
        public bool Ok { get; set; }
        public string Mensaje { get; set; }
    }

Мое ожидаемое поведение: при вводе значения в текстовое поле показывайте div (успех или неудача) с соответствующим сообщением

Myполученное поведение: ввод значения в input ничего не делает

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

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Похоже, что это может быть неправильно:

var url = "@Url.Action("Create", "Categorias")";

Чтобы передать строку "Categorias" в действие "Create", это будет что-то вроде следующего, где вы создадите «анонимный»тип.Может быть, попробуйте:

var url = "@Url.Action("Create", new { categoria = "Categorias"})";
0 голосов
/ 25 мая 2018

Элемент [ValidateAntiForgeryToken] как украшение моего JsonResult заблокировал мое действие Javascript, исключив это украшение и оставив только [HttpPost] для меня работающим !!

0 голосов
/ 25 мая 2018

У вас есть двойные кавычки, которые не экранируются:

<script>
    $(function () {
        $("#btnCrearCategoria").click(function () {

            **var url = "@Url.Action("Create", "Categorias")";**
            var nombre = $("#txtNombre").val();
            var data = {
                v_Nombre: nombre
            };

            $.post(url, data).done(function (data) {
                if (data.Ok) {
                    $("#div-alerta").removeClass("alert-danger").addClass("alert-success").slideDown(
                        100);
                } else {
                    $("div-alerta").removeClass("alert-success").addClass("alert-danger").slideDown(
                        100);
                }

                $("#mensaje-alerta").html(data.Mensaje)
            })
        })
    })
</script>

Вам необходимо либо избежать их, либо использовать одинарные кавычки вокруг всей строки:

var url = '@Url.Action("Create", "Categorias")';

или

var url = "@Url.Action(\"Create\", \"Categorias\")";

Второй вариант может оказаться сложным при попытке управлять всеми обратными слешами "\", поэтому я бы порекомендовал первый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...