Я бы лично пошел по пути 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.