Не могу получить Json с сервера [duplicate]

В случае анонимного выражения функции функция анонимна & nbsp; & mdash; буквально, у него нет имени. Переменная, которую вы назначаете, имеет имя, но функция не работает. (Обновление: это было верно через ES5. Начиная с ES2015 [aka ES6], часто функция, созданная с анонимным выражением, получает истинное имя, читается далее ...)

Имена полезны. Имена можно увидеть в трассировках стека, столах вызовов, списках точек останова и т. Д. Имена - это Good Thing ™.

Вам нужно остерегаться именованных функциональных выражений в более старых версиях IE (IE8 и ниже) , потому что IE ошибочно создает два полностью отдельных объекта функции в два совершенно разных раза (больше в моей статье в блоге Double take ). Если вам нужно поддерживать IE8, лучше всего использовать анонимные выражения функций или функции declarations , но избегать названных функциональных выражений.

Как и в ES2015, анонимные "выражения функций создают функции с именами, и это было обусловлено тем, что различные современные механизмы JavaScript были достаточно умны в определении имен из контекста. В ES2015 выражение анонимной функции приводит к функции с именем boo. Это разбросано по всему spec , а не определено в одном месте с кучей правил: Поиск вхождения «SetFunctionName», в настоящее время найденный в:

Краткая версия в основном в любое время, когда выражение анонимной функции появляется справа от чего-то вроде назначение или инициализацию, например:

var boo = function() { /*...*/ };

(или это могут быть let или const, а не var) или

var obj = {
    boo: function() { /*...*/ }
};

или

doSomething({
    boo: function() { /*...*/ }
});

(последние два - это одно и то же) , результирующая функция будет иметь имя (boo в примерах).

Существует важное и преднамеренное исключение: Назначение ap rperty на существующем объекте:

obj.boo = function() { /*...*/ }; // <== Does not get a name

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

368
задан tereško 18 June 2012 в 18:20
поделиться

10 ответов

В вашем методе действий верните Json (object), чтобы вернуть JSON на вашу страницу.

public ActionResult SomeActionMethod() {
  return Json(new {foo="bar", baz="Blech"});
}

Затем просто вызовите метод действий с помощью Ajax. Вы можете использовать один из вспомогательных методов из ViewPage, например

<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>

SomeMethod будет javascript-методом, который затем оценивает возвращаемый объект Json.

Если вы хотите вернуть plain string, вы можете просто использовать ContentResult:

public ActionResult SomeActionMethod() {
    return Content("hello world!");
}

ContentResult по умолчанию возвращает текст / plain как свой contentType. Это перегружает, поэтому вы также можете делать:

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
460
ответ дан Eduardo Molteni 28 August 2018 в 03:55
поделиться

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

public ActionResult DynamicReturnType(string parameter)
        {
            if (parameter == "JSON")
                return Json("<JSON>", JsonRequestBehavior.AllowGet);
            else if (parameter == "PartialView")
                return PartialView("<ViewName>");
            else
                return null;


        }
2
ответ дан Anil Vaddepally 28 August 2018 в 03:55
поделиться

Чтобы ответить на другую половину вопроса, вы можете вызвать:

return PartialView("viewname");

, когда вы хотите вернуть частичный HTML. Вам просто нужно найти способ решить, хочет ли запрос JSON или HTML, возможно, на основе URL-адреса / параметра.

12
ответ дан Brad Wilson 28 August 2018 в 03:55
поделиться

Гибкий подход для создания разных выходов на основе запроса

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);
  }
}

Метод Request.IsAjaxRequest() довольно прост: он просто проверяет заголовки HTTP для входящего запроса, чтобы узнать, соответствует ли значение X -Requested-С заголовком XMLHttpRequest, который автоматически добавляется большинством браузеров и фреймворками AJAX.

Пользовательский метод расширения, чтобы проверить, является ли запрос для json или нет, чтобы мы могли его вызвать из любого места, как метод расширения Request.IsAjaxRequest ():

using System;
using System.Web;

public static class JsonRequestExtensions
{
  public static bool IsJsonRequest(this HttpRequestBase request)
  {
    return string.Equals(request["format"], "json");
  }
}

Источник: https://www.safaribooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06. HTML # _javascript_rendering

0
ответ дан Mannan Bahelim 28 August 2018 в 03:55
поделиться

Еще один приятный способ обработки данных 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);
    }
);
72
ответ дан radbyx 28 August 2018 в 03:55
поделиться
    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);
            }
        }
2
ответ дан sakthi 28 August 2018 в 03:55
поделиться

Для людей, которые обновили до MVC 3, это аккуратный способ Использование MVC3 и Json

4
ответ дан Sarath 28 August 2018 в 03:55
поделиться

Я обнаружил пару проблем, связанных с вызовами MVC ajax GET с помощью JQuery, которые вызвали у меня головные боли, поэтому здесь обсуждались решения.

  1. Обязательно включите тип данных «json» в вызов ajax. Это автоматически проанализирует возвращаемый объект JSON для вас (если сервер вернет действительный json).
  2. Включите JsonRequestBehavior.AllowGet; без этого MVC возвращал ошибку HTTP 500 (с dataType: json, указанным на клиенте).
  3. Добавьте cache: false в вызов $ .ajax, иначе вы в конечном итоге получите HTTP 304 ответов (вместо HTTP 200 ответов), и сервер не будет обрабатывать ваш запрос.
  4. Наконец, 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);
}
42
ответ дан Shane 28 August 2018 в 03:55
поделиться

Альтернативное решение с рамкой кодирования

Действие return json

Контроллер

    [HttpGet]
    public ActionResult SomeActionMethod()
    {
        return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
    }

Страница Razor

@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())

Действие return 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())
6
ответ дан Vlad 28 August 2018 в 03:55
поделиться

Вы можете взглянуть на эту очень полезную статью, которая очень хорошо описывает это!

Просто подумал, что это может помочь людям найти хорошее решение этой проблемы.

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx

105
ответ дан yoozer8 28 August 2018 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: