gcogco10 Ответов: 1

Asp.net MVC bootstrap modal не сохраняется в базе данных?


Привет Команда

У меня есть метод, который хранит значение в базе данных на моем компьютере. asp.net mvc, в некоторых экземплярах он не хранит это значение. Когда я отлаживаю его, он проходит через все методы. Что мне может не хватать между моим бэк-эндом и фронт-эндом(клиентская сторона)?

Что я уже пробовал:

[HttpGet]
public ActionResult CoursesRegistration( eNtsaRegCourses model)
  {
      if(ModelState.IsValid)
      {
          try
          {
              cb.SaveChanges();
              return Json(new { success = true });
          }catch(Exception ex)
          {
              ModelState.AddModelError("", ex.Message);
          }
      }

      return PartialView("CoursesRegistration", model);
  }


  // saving changes here.
  static void SaveChanges(eNtsaCourses model)
  {

  }

// db-schema lists.
   public class eNtsaCourses
   {
       [Key]
       public Guid? Id { get; set; }
       public string Course { get; set; }
       public string Nickname { get; set; }
       public string Term { get; set; }
       public string EnrolledAs { get; set; }
       public bool Published { get; set; }

   }

@using (Html.BeginForm("CoursesRegistration", "Home", FormMethod.Post, new { id = "createCourseForm", @class = "form-horizontal" }))
                                       {
                                       <div class="modal-footer">
                                           <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
                                           <a href="@Url.Action("CoursesRegistration", "Home")" class="btn btn-large btn-success", onclick="$('#exampleModal').modal('show')">Create Courses</a>
                                           <script type="text/javascript">
                                               function createCourses() {
                                                   $.ajax({
                                                       url: "/Home/CoursesRegistration",
                                                       data: $('#createCourseForm').serialize(),
                                                       type: 'post',
                                                       success: function (data) {
                                                           if (data.Success) {
                                                               $("#exampleModal").modal('hide');
                                                           } else {

                                                           }

                                                       },
                                                       error: function (xhr, status) {

                                                       }

                                                   });
                                                   return false;
                                               }


                                           </script>

                                       </div>
                                       }
                                   </div>

1 Ответов

Рейтинг:
2

F-ES Sitecore

<a href="@Url.Action("CoursesRegistration", "Home")" class="btn btn-large btn-success", onclick="$('#exampleModal').modal('show')">Create Courses</a>


Добавление "onclick" не останавливает действие щелчка по ссылке, поэтому ваш код выполняет модальное действие ("show"), а затем сразу переходит к href, так что переходите к своему действию. Вам нужно остановить щелчок, чтобы ваш модал был показан, сделайте это, добавив "return false"

<a href="@Url.Action("CoursesRegistration", "Home")" class="btn btn-large btn-success" onclick="$('#exampleModal').modal('show'); return false;">Create Courses</a>


Вы также можете изменить высоту и просто

href="#"

поскольку вы не хотите, чтобы это была правильная ссылка, она просто должна запустить ваш js, чтобы показать модальный. Теперь измените действие обратно на HttpPost

[HttpPost]
public ActionResult CoursesRegistration( eNtsaRegCourses model)


Обновленный

Вот урезанная версия того, чего вы хотите достичь

Модальный

public class TestFormModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


Просмотр (TestForm.cshtml)

@model Models.TestFormModel

@using (Html.BeginForm("TestForm", "Home", FormMethod.Post, new { id = "testForm", @class = "form-horizontal" }))
{
    <p>
        <a href="#" onclick="$('#formModal').modal('show'); return false;">Show Modal</a>
    </p>
    <div class="modal" id="formModal">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">Modal title</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">×</span>
                    </button>
                </div>
                <div class="modal-body">
                    <div class="form-group">
                        @Html.LabelFor(m => m.FirstName)
                        @Html.TextBoxFor(m => m.FirstName, new { @class = "form-control" })
                    </div>
                    <div class="form-group">
                        @Html.LabelFor(m => m.LastName)
                        @Html.TextBoxFor(m => m.LastName, new { @class = "form-control" })
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-primary">Save changes</button>
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>
}

<script>
    $("#formModal .btn-primary").click(function () {
        saveForm();
    });

    function saveForm() {
        $.ajax({
            url: "/Home/TestForm",
            data: $('#testForm').serialize(),
            type: 'post',
            success: function (data) {
                if (data.Success) {
                    $("#formModal").modal('hide');
                } else {

                }

            },
            error: function (xhr, status) {

            }

        });
    }
</script>


Контроллер

[HttpGet]
public ActionResult TestForm()
{
    return View();
}

[HttpPost]
public ActionResult TestForm(TestFormModel model)
{
    // save data here

    return Json(new { Success = true });
}


gcogco10

[HttpPost], похоже, не работает, мне нужна ссылка для другой формы, чтобы открыть href="@Url.Action("CoursesRegistration", "Home"). Но с помощью [HttpGet] нет приложения сервера/ошибки. Что я упускаю, вот в чем мой вопрос?

F-ES Sitecore

Тогда вам нужно как HttpGet и HttpPost версии ваших действий. HttpGet вернет представление с формой, а HttpPost обработает форму после ее отправки.

gcogco10

[HttGet] ActionResult? [HttpPost] ActionResult тоже? разрешено ли это mvc? иметь это в одном методе или пост будет на стороне jquery?

F-ES Sitecore

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

[HttpGet]
public ActionResult CoursesRegistration()
{
    // return a View with the form in it
}

[HttpPost]
public ActionResult CoursesRegistration( eNtsaRegCourses model)
{
    // process the form
}

gcogco10

У меня есть они оба, когда я отлаживаю его, он останавливается только на [HttpGet], а не переходит на [HttpPost]. В чем может быть причина такого поведения?

F-ES Sitecore

Он будет отправлен в HttpGet, когда вы выдадите запрос "GET", который происходит, когда вы нажимаете ссылку, помещаете url-адрес в адресную строку или делаете кодовое перенаправление на действие. Он переходит в HttpPost, когда вы отправляете форму с method=POST и имеет действие в атрибуте "action" формы (или используйте ajax, чтобы сделать сообщение для действия).

gcogco10

На стороне клиента, если вы посмотрите на это, я называю пост там. Не могли бы вы привести мне пример этого для стороны ActionResult. Проблема заключается в том, как я ее вижу, поэтому она не передается в [HttpPost]

F-ES Sitecore

Вероятно, вы просто путаетесь в том, что на самом деле делает ваш код, поскольку он делает так много вещей. У вас есть форма, которая делает сообщение, ссылка, которая делает GET, и javascript, который делает POST...so три способа спровоцировать действие, но какой из них на самом деле делается? Форма будет публиковаться только в том случае, если вы нажмете кнопку отправки, ajax будет публиковаться только в том случае, если вы вызовете функцию js, и ссылка будет получена, когда вы нажмете на нее. Если вы нажмете на ссылку, чтобы запустить ajax-код, ссылка все равно будет нажата, так что она все равно будет получена. Вы должны остановить, что функция onclick возвращает false.

gcogco10

Я понимаю вашу точку зрения, причина, по которой я делаю click be true, эта ссылка открывает всплывающее модальное окно, которое мне нужно передать данные обратно в мой столбец базы данных, я не знаю, звучит ли это или имеет смысл.

F-ES Sitecore

Да, но наличие кода в атрибуте onclick не останавливает навигацию по ссылкам, поэтому ваш модальный показ показывает, что браузер мгновенно переходит от страницы, поэтому вам нужно, чтобы он вернул false.

gcogco10

у меня есть возврат false, теперь форма ничего не делает. не то, что я хочу там, помоги мне там на секунду

F-ES Sitecore

Он должен показывать ваш модал, если он правильно настроен, вы не показываете наценку для него, и вам нужно убедиться, что модал вызывает вашу функцию "createCourses" при отправке или при нажатии кнопки "Сохранить" в модале. Поскольку createCourses использует форму createCourseForm для получения данных отправки, Вам необходимо убедиться, что ваш "exampleModal" находится внутри формы, созданной с помощью BeginForm, и имеет соответствующие поля, необходимые модели eNtsaRegCourses.

F-ES Sitecore

Я обновил свое решение с помощью скелетной версии того, что вы, вероятно, пытаетесь достичь

gcogco10

Ф-ЭС не возражает поделиться этим, я острый приятель

F-ES Sitecore

Посмотрите на решение, которое я уже опубликовал, я добавил код в его нижнюю часть.

gcogco10

Ну я использовал пример shared, он все равно не попадает в пост на контроллере, только попадает в [HttpGet].

@using(Html.BeginForm("CoursesRegistration", "Home", FormMethod.Post, new { id="saveData", @class="form-horizontal"})) { 
                            
                                
                                    
                                        
                                            <h5 class="modal-title" id="exampleModalLabel">Start New Course</h5>
                                            
                                                <span>×</span>
                                            
                                        
                                        
                                            CourseName
                                            
                                                @Html.EditorFor(model => model.CourseName, new { htmlAttributes = new { @class = "form-control", autofocus = "autofocus", placeholder = "CourseName" } })

                                            
                                        
                                        
                                            Content Licence
                                            
                                            
                                            
                                        
                                       
                                        
                                            Cancel
                                            <a href="@Url.Action(" class="btn btn-large btn-success">Create Courses</a>
                                            
                                                $("#exampleModal.btn-success").click(function () {
                                                    saveData();
                                                });

                                                function saveData() {
                                                    $.ajax({
                                                        url: "/Home/CoursesRegistration",
                                                        data: $('#coursesRegistration').serialize(),
                                                        type: 'post',
                                                        success: function (data) {
                                                            if (data.Success) {
                                                                $("#exampleModal").modal('hide');
                                                            } else {

                                                            }

                                                        },
                                                        error: function (xhr, status) {

                                                        }
                                                       
                                                    });
                                                    return false;
                                                }

F-ES Sitecore

В вашем коде есть искаженная ссылка "а", поэтому трудно сказать, идет ли она просто по ссылке, когда вы нажимаете на нее, поскольку вы, похоже, устанавливаете href для своего действия. Посмотрите на мой пример, href-это просто маркер"#", поэтому он выглядит и действует как ссылка, а затем onclick вызывает модал.

gcogco10

Сайт F-ES имел обходной путь, как способ проследить за скелетом. По какой-то причине, когда я отлаживаю его, он попадает только в метод HttpGet, а не HttPost. Я все еще пытаюсь понять причину этого. На самом деле в настоящее время код выглядит точно так же, но проблема в том, что метод Httpost вообще не попадает туда.