Правильный способ использования AJAX Post в jquery для передачи модели из строго типизированного представления MVC3

Я начинающий программист, поэтому, пожалуйста, простите меня, если некоторые из моих «жаргонов» неверны. У меня есть проект с использованием ASP.NET с использованием среды MVC3.

Я работаю над администратором, где администратор изменит список оборудования. Одной из функций является кнопка «Обновить», которую я хочу использовать jquery для динамического редактирования записи на веб-странице после отправки сообщения в controller MVC.

Я предполагаю, что этот подход «безопасен» в одном административном режиме, где существует минимальная проблема с тем, что веб-страница не синхронизируется с базой данных.

Я создал представление, которое строго типизировано, и надеялось передать данные модели в элемент управления MVC, используя пост AJAX.

В следующем сообщении я нашел то, что похоже на то, что я ищу: JQuery Ajax и ASP.NET MVC3, вызывающие нулевые параметры

Я буду использовать образец кода из вышеуказанного сообщения.

Модель:

public class AddressInfo { public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } public string Country { get; set; } } 

controller:

 public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] public ActionResult Check(AddressInfo addressInfo) { return Json(new { success = true }); } } 

скрипт в представлении:

  var ai = { Address1: "423 Judy Road", Address2: "1001", City: "New York", State: "NY", ZipCode: "10301", Country: "USA" }; $.ajax({ url: '/home/check', type: 'POST', data: JSON.stringify(ai), contentType: 'application/json; charset=utf-8', success: function (data.success) { alert(data); }, error: function () { alert("error"); } });  

У меня еще не было возможности использовать вышеупомянутое. Но мне было интересно, был ли это «лучший» метод передать данные модели обратно в элемент управления MVC с помощью AJAX?

Должен ли я беспокоиться о том, чтобы разоблачить информацию о модели?

Вы можете пропустить объявление var и stringify. В противном случае это будет работать нормально.

 $.ajax({ url: '/home/check', type: 'POST', data: { Address1: "423 Judy Road", Address2: "1001", City: "New York", State: "NY", ZipCode: "10301", Country: "USA" }, contentType: 'application/json; charset=utf-8', success: function (data) { alert(data.success); }, error: function () { alert("error"); } }); 

Я нашел 3 способа реализовать это:

Класс C #:

 public class AddressInfo { public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } public string Country { get; set; } } 

Действие:

 [HttpPost] public ActionResult Check(AddressInfo addressInfo) { return Json(new { success = true }); } 

JavaScript вы можете сделать это тремя способами:

1) Строка запроса:

 $.ajax({ url: '/en/Home/Check', data: $('#form').serialize(), type: 'POST', }); 

Данные здесь представляют собой строку.

"Address1=blah&Address2=blah&City=blah&State=blah&ZipCode=blah&Country=blah"

2) Массив объекта:

 $.ajax({ url: '/en/Home/Check', data: $('#form').serializeArray(), type: 'POST', }); 

Данные здесь представляют собой массив пар ключ / значение:

 =[{name: 'Address1', value: 'blah'}, {name: 'Address2', value: 'blah'}, {name: 'City', value: 'blah'}, {name: 'State', value: 'blah'}, {name: 'ZipCode', value: 'blah'}, {name: 'Country', value: 'blah'}] 

3) JSON:

 $.ajax({ url: '/en/Home/Check', data: JSON.stringify({ addressInfo:{//missing brackets Address1: $('#address1').val(), Address2: $('#address2').val(), City: $('#City').val(), State: $('#State').val(), ZipCode: $('#ZipCode').val()}}), type: 'POST', contentType: 'application/json; charset=utf-8' }); 

Данные здесь представляют собой сериализованную строку JSON. Обратите внимание, что имя должно совпадать с именем параметра на сервере!

 ='{"addressInfo":{"Address1":"blah","Address2":"blah","City":"blah","State":"blah", "ZipCode", "blah", "Country", "blah"}}' 

Так оно и работало для меня:

 $.post("/Controller/Action", $("#form").serialize(), function(json) { // handle response }, "json"); [HttpPost] public ActionResult TV(MyModel id) { return Json(new { success = true }); } 

то, что у вас есть, хорошо – однако, чтобы сохранить некоторую типизацию, вы можете просто использовать для своих данных


 data: $ ('# formId'). serialize ()

см. http://www.ryancoughlin.com/200/2009/05/04/how-to-use-jquery-to-serialize-ajax-forms/ для подробностей, синтаксис довольно прост.

Если вы используете MVC 5, прочитайте это решение!

Я знаю вопрос, специально названный для MVC 3, но я наткнулся на эту страницу с MVC 5 и хотел опубликовать решение для кого-либо еще в моей ситуации. Я пробовал вышеупомянутые решения, но они не работали для меня, фильтр действий не был достигнут, и я не мог понять, почему. Я использую версию 5 в своем проекте и в итоге получил следующий фильтр действий:

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Filters; namespace SydHeller.Filters { public class ValidateJSONAntiForgeryHeader : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { string clientToken = filterContext.RequestContext.HttpContext.Request.Headers.Get(KEY_NAME); if (clientToken == null) { throw new HttpAntiForgeryException(string.Format("Header does not contain {0}", KEY_NAME)); } string serverToken = filterContext.HttpContext.Request.Cookies.Get(KEY_NAME).Value; if (serverToken == null) { throw new HttpAntiForgeryException(string.Format("Cookies does not contain {0}", KEY_NAME)); } System.Web.Helpers.AntiForgery.Validate(serverToken, clientToken); } private const string KEY_NAME = "__RequestVerificationToken"; } } 

– Обратите внимание на using System.Web.Mvc и using System.Web.Mvc.Filters , а не http библиотек (я думаю, что это одна из вещей, которые изменились с MVC v5. –

Затем просто примените фильтр [ValidateJSONAntiForgeryHeader] к вашему действию (или controllerу), и он должен быть вызван правильно.

На моей странице макета прямо над меня есть @AntiForgery.GetHtml();

Наконец, на моей странице Razor я делаю вызов ajax следующим образом:

 var formForgeryToken = $('input[name="__RequestVerificationToken"]').val(); $.ajax({ type: "POST", url: serviceURL, contentType: "application/json; charset=utf-8", dataType: "json", data: requestData, headers: { "__RequestVerificationToken": formForgeryToken }, success: crimeDataSuccessFunc, error: crimeDataErrorFunc }); 
  • Как получить заголовок с карточек или похожих предметов с одинаковой высотой с помощью гибкой коробки?
  • В чем смысл заголовка X-Requested-With?
  • Эффект jQuery .slideRight
  • JQuery - Как сделать $ .post () использовать contentType = application / json?
  • Самый простой способ создать каскадное выпадающее меню ASP.NET MVC 3 с помощью C #
  • Google Maps v3 частично загружается в верхнем левом углу, событие изменения размера не работает
  • Выбор первых элементов «n» с помощью jQuery
  • Получить список отмеченных флажков в div с помощью jQuery
  • Получить параметр, отправленный через jquery ajax в Java Servlet
  • Internet Explorer 9 не правильно отображает ячейки таблицы
  • Эффект пишущей машинки с jQuery
  • Давайте будем гением компьютера.