Заставьте контроллер возвращать часть динамически на любую страницу, на которой есть виджет, когда! ModelState.IsValid - PullRequest
1 голос
/ 28 февраля 2012

Итак, я создал модуль фруктового сада, который в основном является формой контакта в качестве виджета. Этот виджет может быть размещен на любой странице как часть (или как виджет), и он отправляет свои данные контроллеру, который обрабатывает данные публикации, после того, как он отправляет электронное письмо, он возвращает «отправленное» представление, которое суммирует их ввод. Проблема, с которой я столкнулся, связана с неправильной моделью. Когда я отлаживаю код, он отлично подходит для проверки.

if (!ModelState.IsValid)
{
   //Gets here no problem
}

Но проблема в том, что, поскольку мой виджет может в основном находиться на любой странице (домашней странице, на отдельной странице, в глобальной области, то есть на каждой странице), он может быть виджетом или частью типа. Я не знаю, как отправить модель обратно на страницу отправителя. Я думаю, у меня есть несколько вариантов.

Интересным примечанием является то, что если я помещу свою форму в «глобальную» область моего сайта (как в боковой панели на каждой странице, что более важно, на мою «отправленную» страницу), то форма на этой странице будет фактически есть ошибки «проверки», отображаемые на форме. Так что каким-то образом он все еще передает мою модель представления на страницу, даже при том, что я не возвращаю ее явно.

a) Каким-то образом сопоставить URL-адрес отправителя с действием контроллера, например, если у URL-адреса нет субдомена, мы перенаправляем его на контроллер домашней страницы или что-то еще (не знаю, как справится с этим Орчард)

б) Каким-то образом сделать это в области обработчика / драйвера, также не знаю, как я это сделаю.

в) Скорее, не делайте так, а просто заставьте мой контроллер возвращать данные json и отправлять форму в контроллер асинхронно через jquery.

1 Ответ

0 голосов
/ 29 февраля 2012

Я бы лично пошел по пути JSON / Ajax, если у вас нет жестких требований, чтобы система ДОЛЖНА работать, когда Javascript не включен (или когда вы можете признать, что ваша система имеет недостатки, когда Javascript отключен).Кроме того, это дает вашей стороне хорошее поведение ... то, что AJAX делает с любым сайтом;).

Либо визуализируйте ваш контактный виджет как PartialView, либо как PartialAction (любой из них должен работать, возможно, он уже запущен.

@* This is, of course, oversimplified for the sake keeping the post short. 
   I'd be happy to provide more details if you need'em *@
<form id="contact" action="@Url.Action("ContactWidget", "Send")" method="post">
{
    @Html.Textbox("name");
    @Html.TextArea("message");
    <input type="submit" value="Send" />
}

Затем используйте Javascript (и jQuery в этом примере). В идеале в отдельно включенном файле .js (учитывая, что этот файл будет на всем сайте, он уменьшит размер ваших страниц, так как .js кешируется).

$('form#contact input[type=submit]').on('click', function () {
    var form = $(this).closest('form');
    var data = form.serialize();
    var postURL = form.attr('action');

    // do the actual post
    $.post(postURL, data, function (response) {
        if (response) {
            form.parent().html($(response));
        }
    });

    return false;
});

Это заменит содержимое контейнера формы тем ответом, который вы получите на свой вызов POST. Таким образом, на этом этапе вы можете реализовать действие «Отправить» вашего контроллера, как вам будет угодно, и иметьон отвечает с частичным просмотром содержимого. Является ли тот HTML, который он возвращает, той же формой с ошибками проверки, или сообщением «Спасибо», зависит только от вас. Это может быть что-то вроде ...

public ActionResult Send(SendViewModel model)
{
    if (!ModelState.IsValid)
        return View("Widget", model); // where "Widget" is the .cshtml with the form

    // do the actual message sending...

    // return a thank you note
    return View("ThankYou"); // where "ThankYou" is the .cshtml with the Thank You message
}

Обратите внимание, что даже если Javascript не включен, ваш виджет будет выполнять полный POST-браузер для вашего виджета, но результатом будет только вывод конформа такта.Я не буду вдаваться в подробности, если вы не нуждаетесь во мне, но вы можете использовать расширение Request.IsAjaxRequest () и HttpReferrer для перенаправления пользователя на исходную страницу после обработки POST.

...