ASP.NET действия контроллера MVC, которые возвращают JSON или частичное HTML-код
Я пытаюсь создать действия контроллера, которые будут возвращать либо JSON, либо частичный html в зависимости от параметра. Что является лучшим способом, чтобы получить результат возвращается в ДТП страницу асинхронно?
11 ответов:
в вашем методе действия верните Json (объект), чтобы вернуть JSON на вашу страницу.
public ActionResult SomeActionMethod() { return Json(new {foo="bar", baz="Blech"}); }
затем просто вызовите метод действия с помощью Ajax. Вы можете использовать один из вспомогательных методов из ViewPage, таких как
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod будет методом javascript, который затем вычисляет возвращаемый объект Json.
если вы хотите вернуть простую строку, вы можете просто использовать ContentResult:
public ActionResult SomeActionMethod() { return Content("hello world!"); }
ContentResult по умолчанию возвращает текст/равнина как его contentType.
Это перегружается, так что вы также можете сделать:return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Я думаю, что вы должны рассмотреть AcceptTypes запроса. Я использую его в моем текущем проекте, чтобы вернуть правильный тип содержимого следующим образом.
ваше действие на контроллере может проверить его как на объекте запроса
if (Request.AcceptTypes.Contains("text/html")) { return View(); } else if (Request.AcceptTypes.Contains("application/json")) { return Json( new { id=1, value="new" } ); } else if (Request.AcceptTypes.Contains("application/xml") || Request.AcceptTypes.Contains("text/xml")) { // }
затем вы можете реализовать aspx представления для удовлетворения частичного случая ответа xhtml.
затем в jQuery вы можете извлечь его, передав параметр типа как json:
$.get(url, null, function(data, textStatus) { console.log('got %o with status %s', data, textStatus); }, "json"); // or xml, html, script, json, jsonp or text
надеюсь, это поможет Джеймс
еще один хороший способ работы с данными JSON-это использование функции jQuery getJSON. Вы можете позвонить в
public ActionResult SomeActionMethod(int id) { return Json(new {foo="bar", baz="Blech"}); }
метод из метода jQuery getJSON просто...
$.getJSON("../SomeActionMethod", { id: someId }, function(data) { alert(data.foo); alert(data.baz); } );
я нашел пару проблем, реализующих MVC ajax GET calls с JQuery, которые вызвали у меня головные боли, поэтому решения для обмена здесь.
- обязательно включите тип данных "json" в вызов ajax. Это автоматически проанализирует возвращенный объект JSON для вас (учитывая, что сервер возвращает действительный json).
- включить
JsonRequestBehavior.AllowGet
; без этого MVC возвращал ошибку HTTP 500 (сdataType: json
указано на клиенте).- добавить
cache: false
к $.AJAX-вызов, в противном случае вы в конечном итоге получите ответы HTTP 304 (вместо ответов HTTP 200), и сервер не будет обрабатывать ваш запрос.- наконец, json чувствителен к регистру, поэтому корпус элементов должен соответствовать на стороне сервера и стороне клиента.
Образец JQuery:
$.ajax({ type: 'get', dataType: 'json', cache: false, url: '/MyController/MyMethod', data: { keyid: 1, newval: 10 }, success: function (response, textStatus, jqXHR) { alert(parseInt(response.oldval) + ' changed to ' + newval); }, error: function(jqXHR, textStatus, errorThrown) { alert('Error - ' + errorThrown); } });
пример кода MVC:
[HttpGet] public ActionResult MyMethod(int keyid, int newval) { var oldval = 0; using (var db = new MyContext()) { var dbRecord = db.MyTable.Where(t => t.keyid == keyid).FirstOrDefault(); if (dbRecord != null) { oldval = dbRecord.TheValue; dbRecord.TheValue = newval; db.SaveChanges(); } } return Json(new { success = true, oldval = oldval}, JsonRequestBehavior.AllowGet); }
чтобы ответить на вторую половину вопроса, Вы можете позвонить:
return PartialView("viewname");
Если вы хотите вернуть частичный HTML. Вам просто нужно найти способ решить, хочет ли запрос JSON или HTML, возможно, на основе части/параметра URL.
альтернативное решение с incoding framework
Action return json
контроллер
[HttpGet] public ActionResult SomeActionMethod() { return IncJson(new SomeVm(){Id = 1,Name ="Inc"}); }
страница бритва
@using (var template = Html.Incoding().ScriptTemplate<SomeVm>("tmplId")) { using (var each = template.ForEach()) { <span> Id: @each.For(r=>r.Id) Name: @each.For(r=>r.Name)</span> } } @(Html.When(JqueryBind.InitIncoding) .Do() .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) .OnSuccess(dsl => dsl.Self().Core() .Insert .WithTemplate(Selector.Jquery.Id("tmplId")) .Html()) .AsHtmlAttributes() .ToDiv())
действие возвращает html
контроллер
[HttpGet] public ActionResult SomeActionMethod() { return IncView(); }
страница бритва
@(Html.When(JqueryBind.InitIncoding) .Do() .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) .OnSuccess(dsl => dsl.Self().Core().Insert.Html()) .AsHtmlAttributes() .ToDiv())
вы можете взглянуть на эту очень полезную статью, которая охватывает это очень красиво!
просто думал, что это может помочь людям, ищущим хорошее решение этой проблемы.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
для людей, которые перешли на MVC 3 вот аккуратный способ С помощью MVC3 и Json
PartialViewResult и JSONReuslt наследуют от базового класса ActionResult. поэтому, если тип возвращаемого значения определяется динамически, объявите метод output как ActionResult.
public ActionResult DynamicReturnType(string parameter) { if (parameter == "JSON") return Json("<JSON>", JsonRequestBehavior.AllowGet); else if (parameter == "PartialView") return PartialView("<ViewName>"); else return null; }
public ActionResult GetExcelColumn() { List<string> lstAppendColumn = new List<string>(); lstAppendColumn.Add("First"); lstAppendColumn.Add("Second"); lstAppendColumn.Add("Third"); return Json(new { lstAppendColumn = lstAppendColumn, Status = "Success" }, JsonRequestBehavior.AllowGet); } }
гибкий подход для получения различных результатов по запросу
public class AuctionsController : Controller { public ActionResult Auction(long id) { var db = new DataContext(); var auction = db.Auctions.Find(id); // Respond to AJAX requests if (Request.IsAjaxRequest()) return PartialView("Auction", auction); // Respond to JSON requests if (Request.IsJsonRequest()) return Json(auction); // Default to a "normal" view with layout return View("Auction", auction); } }
The
Request.IsAjaxRequest()
метод довольно прост: он просто проверяет заголовки HTTP для входящего запроса, чтобы увидеть, является ли значение заголовка X-Requested-WithXMLHttpRequest
, который автоматически добавляется большинством браузеров и фреймворков AJAX.пользовательский метод расширения, чтобы проверить, является ли запрос для json или нет, так что мы можем вызвать его из любого места, так же, как Запрос.IsAjaxRequest() метод расширения:
using System; using System.Web; public static class JsonRequestExtensions { public static bool IsJsonRequest(this HttpRequestBase request) { return string.Equals(request["format"], "json"); } }