Ненавязчивая форма Ajax для частичного просмотра

У меня возникли проблемы с использованием ненавязчивого ajax для публикации данных из формы обратной связи.

Мой частичный вид выглядит так:

@model site.ViewModel.Home.ContactUsViewModel 

@using (Ajax.BeginForm("_ContactUsPartial", "Home", 
                       new AjaxOptions { UpdateTargetId = "result" }))
        {
            <fieldset>
                <legend>Contact Us</legend>
                @Html.ValidationSummary(true)
                <div id="result"></div>
                <div class="editor-label">
                 @Html.LabelFor(m => m.FullName)
                 @Html.ValidationMessageFor(m => m.FullName)</div>
                <div class="editor-field">@Html.TextBoxFor(m => m.FullName)</div>
                <!-- other fields from model -->
                <input type="submit" value="Submit"/>
            </fieldset>
        }

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

@Html.Partial("_ContactUsPartial", new ContactUsViewModel());

Мой домашний контроллер вот такой:

[HttpPost]
public ActionResult _ContactUsPartial(ContactUsViewModel viewModel)
{
    if (ModelState.IsValid)
    {
       try
       {
           //send email
           return Content("Thanks for your message!");
       }
       catch (Exception ex)
       {
          return Content("Problem sending the email.");
       }
    }

            return Content("oops. invalid model");
}

Я ожидаю, что когда я нажму «Отправить», контроллер вернет некоторый текстовый контент, который будет помещен в div с идентификатором «результат».

Что на самом деле происходит, так это то, что когда я нажимаю «Отправить», меня перенаправляют на /Home/_ContactUsPartial, при этом отображается только текстовое содержимое.

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

У меня включен ненавязчивый javascript в моем Web.config, и у меня также есть ссылка на jquery.unobtrusive-ajax.min.js.

В моей папке Scripts у меня есть следующее, что может быть актуально:

  • jquery.ненавязчивый-ajax.min.js
  • jquery.validate.ненавязчивый.min.js
  • MicrosoftMvcAjax.js

В моем теге _Layout.cshtml у меня объявлено следующее:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/bootstrap.min.js")" type="text/javascript"></script>

В моем Global.asax.cs Application_Start у меня есть эта строка:

BundleConfig.RegisterBundles(BundleTable.Bundles);

RegisterBundles выглядит так:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                        "~/Scripts/jquery-ui-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.unobtrusive*",
                        "~/Scripts/jquery.validate*"));

Не уверен, что делают пакеты и как они работают, потому что я, кажется, настроил их для ввода через этот ScriptBundle... но затем я также настроил их вручную в заголовке _Layout.cshtml....

Любая идея, что я делаю неправильно? Я был бы очень признателен за помощь в этом!


person mezoid    schedule 04.05.2013    source источник
comment
Итак, это похоже на проблему отсутствия права на ненавязчивую настройку. Убедились ли вы, что Microsoft.Unobtrusiveбиблиотеки удалены из проекта? Я сталкивался с этой проблемой несколько раз, и в итоге это были проблемы с библиотекой и зависимостями.   -  person Nomad101    schedule 04.05.2013
comment
@ Nomad101 Нет, я этого не делал... но не уверен на 100%, как...   -  person mezoid    schedule 04.05.2013
comment
вы используете Nuget с визуальной студией? или что-то другое? Также вы внедряете связку с проектом?   -  person Nomad101    schedule 04.05.2013
comment
@ Nomad101 Я использую Nuget... но в моем текущем проекте некоторые вещи были добавлены без Nuget до того, как я начал над ним работать.   -  person mezoid    schedule 04.05.2013
comment
это нормально, перейдите к установленному и найдите Microsoft JQuery ненавязчивый ajax и проверку и удалите их, которые вы можете легко отменить, если это необходимо. Однако эти библиотеки Microsoft вызывают конфликты с библиотеками jquery, и библиотеки Microsoft теперь также устарели.   -  person Nomad101    schedule 04.05.2013
comment
@ Nomad101 Nomad101 Я проверил и не вижу установленного Microsoft Unobtrusive ... Я обновлю свой пост с моими текущими сценариями конфигурации ...   -  person mezoid    schedule 04.05.2013
comment
Если вы используете пакеты, почему вы используете теги ‹script› используйте @Script.Render(~/bundles/jquery) @Script.render(~/bundles/jqueryui) @Script.Render(~/bundles/jqueryval) в вашем страница макета.   -  person HaBo    schedule 04.05.2013
comment
@HaBo в основном потому, что я не знал об использовании Scripts.Render. Теперь я сделал это вместо этого ... не то, чтобы это решило мою проблему.   -  person mezoid    schedule 04.05.2013
comment
почему вы возвращаете контент, а не частичный просмотр?   -  person Dave Alperovich    schedule 04.05.2013
comment
теперь, когда вы используете @Scrip.Render, при загрузке диалогового окна проверьте исходный код и убедитесь, что все необходимые ссылки на скрипты загружены.   -  person HaBo    schedule 04.05.2013
comment
хороший улов @DaveA. meziod return Json(Спасибо за сообщение!, JsonRequestBehaviour.AllowGet); также, если нет особой причины для использования ActionResult. Я рекомендую вам использовать JsonResult вместо ActionResult   -  person HaBo    schedule 04.05.2013
comment
@HaBo Я вижу, что jquery.unobtrusive-ajax.min.js загружен. И когда я обновляю свой код, чтобы вернуть JsonResult... я получаю ту же проблему, но на этот раз с сообщением Json, отображаемым в перенаправленном частичном представлении.   -  person mezoid    schedule 04.05.2013
comment
загружен ли полный jquery? также проверьте раздел обновлений nuget.   -  person Nomad101    schedule 04.05.2013


Ответы (1)


у меня наконец то получилось!!!! После часа потраченного времени!!!

Оказывается, это была проблема с конфигурацией... но не совсем то, что я ожидал.

Я использую jQuery 1.9.1, и я думал, что это последняя версия Microsoft.jQuery.Unobtrusive.Ajax версии 2.0.30116.0. Однако возникла проблема... ненавязчивый js-файл jquery ajax, в котором я все еще использовал устаревший метод live, а не метод on... Даже при выполнении пакета обновления файл не обновлялся правильно.

Только когда я увидел этот пост ASP.NET MVC 4 : не могу изменить jQuery Unobtrusive Ajax, я проверил файл, который у меня был, и обнаружил, что это старая версия.

Сначала я использовал пакет nuget jQuery.Migrate для повторного включения живого метода... но я обнаружил, что лучшим решением было удалить или удалить существующий файл и использовать nuget для переустановки пакета Microsoft.jQuery.Unobtrusive.Ajax.

Это устранило проблему, и теперь все работает именно так, как ожидалось!

person mezoid    schedule 04.05.2013
comment
Именно то, что мне нужно. Запустил Install-Package Microsoft.jQuery.Unobtrusive.Ajax в консоли диспетчера пакетов, добавил файлы JS в пакет сценариев, и я снова в деле. - person Rick james; 22.06.2015