Возврат вызова JavaScript с контроллера ASP.NET MVC 4 Razor

Я хочу обрабатывать некоторые ошибки в моем проекте ASP.NET MVC 4. Раньше я разрабатывал приложения WebForms, и я использовал Page.ClientScript.RegisterClientScriptBlock, но MVC! = WebForms с его серверными элементами управления, обратной связью и т.д. Поэтому я немного смущен.

Конечно, я могу вернуться с контроллера JSON-ответа, используя return Json(...) как return Json(...), но подождите.

У меня есть вид. Он имеет точную разметку. Как мой вид распознает, какой modalbox я должен вызывать из кода jQuery + bootstap?

Прежде всего, я думал использовать параметры GET для обработки строки запроса.

Если /Index/UserNotExist → Затем вызовите функцию jQuery с отображением пользовательского модального окна

Иначе, если другой URL-адрес → Затем вызовите функцию jQuery с отображением того же модального блока, но с другим текстом в нем.

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

Затем я подумал о файлах cookie, написав временные данные в cookie и сделаю простую проверку.

Но в WebForms такая проверка кода, if (Request.Cookies["error"] != null, MVC даже не принимает такую проверку, она всегда будет делать исключения.

Я немного устал и хочу послушать ваши предложения.

Что я делаю не так?

благодаря

2 ответа

То, как я приношу ошибки с сервера клиенту -when, не использует ajax для использования моего контроллера actions-, используя TempData.

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

Итак, этот метод

protected void AddError(string message, string header = null)
 {
 TempData[Constants.ErrorKey] = new ViewMessage
 {
 Type = eMessageType.Error,
 Header = header,
 Content = message
 };
 }

Добавляет сообщение об ошибке в TempData.

В моем _Layout.cshtml у меня есть раздел для отображения ошибок, используя бутстрап-предупреждение:

@if (TempData[Constants.ErrorKey] != null)
{ 
 var error = TempData[Constants.ErrorKey] as ViewMessage;
 <div>
 <a data-dismiss="alert" href="#" target="_blank">×</a>
 
 <h4>@error.Header:</h4>
 <p>@error.Content</p>
 
 </div>
 
}

Таким образом, при вызове любого действия в любом контроллере возникает ошибка бизнес-логики, появляется предупреждение с содержимым ошибки.

Вы можете комбинировать фильтры действий для необработанных исключений и быть такими же сложными, сколько вам нужно, но это основная идея.

Вы также можете использовать сеанс, но TempData более подходит, потому что значения выставляются после их использования.

Если, с другой стороны, вы используете ajax для взаимодействия с вашими действиями, то это чистые сценарии на стороне клиента и манипуляции с dom.


Если я правильно вас понимаю...

public class UserController : Controller
{
 public ActionResult GetUser(int userId)
 {
 var user = // Get user by user id.
 if (user == null)
 return null;
 else
 {
 var serializer = new JavaScriptSerializer();
 return Json (new {user = serializer.Serialize(user)});
 }
 }
}

public class ModalViewController : Controller
{
 public ActionResult Index(string message)
 {
 ViewBag.Message = message;
 return PartialView("ModalView");
 }
}

var actionUrl = '/User/GetUser';
var data = { "userId": userId };

$.ajax({
 url: actionUrl,
 type: "POST",
 dataType: "json",
 contentType: "application/json; charset=utf-8",
 data: JSON.stringify(data),
 success: function (user) {
 ShowModalView(user == null || user.length <= 0);
 },
 error: function (jqXHR, textStatus, errorThrown) {
 alert(eval("(" + jqXHR.responseText + ")"));
 });

function ShowModalView(userExists) {
var actionUrl = '/ModalView/Index';
var data = { "message": userExists ? "hi there user" : "oops, no user found" };

$.ajax({
 url: actionUrl,
 type: "POST",
 dataType: "html",
 contentType: "application/json; charset=utf-8",
 data: JSON.stringify(data),
 success: function (modalView) {
 $('#detailsDiv').replaceWith(modalView);
 },
 error: function (jqXHR, textStatus, errorThrown) {
 alert(eval("(" + jqXHR.responseText + ")"));
 });
}

Таким образом, вы сначала сделаете ajax-вызов метода действия, чтобы проверить, существует ли пользователь, а затем сделать другой вызов ajax, чтобы вернуть частичный вид вашего модального представления. Модальное представление получает сообщение от ViewBag, а в методе обратного вызова успеха вашего второго вызова ajax вы можете отобразить частичный вид в главном представлении, где хотите.

licensed under cc by-sa 3.0 with attribution.