JSON 또는 부분 HTML을 반환하는 ASP.NET MVC 컨트롤러 작업


406

매개 변수에 따라 JSON 또는 부분 html을 반환하는 컨트롤러 작업을 만들려고합니다. 결과를 MVC 페이지에 비동기 적으로 반환하는 가장 좋은 방법은 무엇입니까?

답변:


519

액션 메소드에서 Json (object)을 반환하여 JSON을 페이지로 반환하십시오.

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

그런 다음 Ajax를 사용하여 액션 메소드를 호출하십시오. ViewPage에서 다음과 같은 도우미 메소드 중 하나를 사용할 수 있습니다.

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

SomeMethod는 반환 된 Json 객체를 평가하는 자바 스크립트 메소드입니다.

일반 문자열을 반환하려면 ContentResult를 사용하면됩니다.

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

기본적으로 ContentResult는 text / plain을 contentType으로 반환합니다.
오버로드 가능하므로 다음을 수행 할 수도 있습니다.

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");

9
미안 필! 이것은 실제로 질문에 대답하지 않습니까? 그것의 확실히 유용하지만 브래드가 말한대로 그들이 요구하는 것을 찾아서 그에 따라 결과를 반환해야한다고 말합니다.
Simon_Weaver

나의 다소 관련 (물론 여기에 저를지도 한) 질문을 참조 stackoverflow.com/questions/482363/...
Simon_Weaver

9
답변을 찾으면 질문 자체에 연결하십시오. 또한 대답이 옳은 것으로 이것을 확인하지는 않습니다.
Cherian 2019


해당 Json 클래스의 정규화 된 이름은 무엇입니까?
Josh Withee

112

요청의 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"))
{
   //
}

그런 다음 부분적인 xhtml 응답 사례를 제공하기 위해보기의 aspx를 구현할 수 있습니다.

그런 다음 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

이것이 제임스에게 도움이되기를 바랍니다.


5
감사합니다. James는 동일한 컨트롤러 작업을 사용하여 일종의 웹 사이트 및 REST API를 만드는 데 매우 유용 할 수 있습니다.
NathanD

내 컨트롤러에 이와 같은 많은 방법이 있다면이를보다 일반적으로 수행 할 수있는 방법이 있습니까?
Seph

Json 클래스는 어떤 네임 스페이스에 있습니까? project.json의 종속성은 무엇입니까? 미리 감사드립니다
Andrei

1
그것은 System.Web.Mvc (System.Web.Mvc.dll) @Andrei 의 JsonResult 클래스입니다.
James Green

고마워요. 새 API를 반영하도록 답변을 업데이트 하시겠습니까? Btw, Microsoft.AspNetCore.Mvc.JsonResult 인 dotnet 코어를 사용하고 있습니다.
Andrei

78

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

15
이것은 질문에 전혀 대답하지 않습니다.
Aaronaught

2
@Aaronaught 사실 첫 번째 부분 return Json(new {foo="bar", baz="Blech"});은 않습니다!
SparK

$ .post stackoverflow.com/questions/751218/… 도 고려하십시오. (보안상의 이유로 JSON Get 요청을 비활성화하기 위해 ASP.Net MVC 기본값)
Greg

50

JQuery로 MVC ajax GET 호출을 구현하는 몇 가지 문제가있어 두통을 일으켜 솔루션을 공유했습니다.

  1. Ajax 호출에 데이터 유형 "json"을 포함시켜야합니다. 이것은 반환 된 JSON 객체를 자동으로 구문 분석합니다 (서버가 유효한 json을 반환하면).
  2. 포함 JsonRequestBehavior.AllowGet; 이 MVC가 없으면 HTTP 500 오류를 반환했습니다 (dataType: json 클라이언트에 지정된 .
  3. cache: false$ .ajax 호출에 추가하십시오 . 그렇지 않으면 결과적으로 HTTP 200 응답 대신 HTTP 304 응답이 표시되고 서버는 요청을 처리하지 않습니다.
  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);
}

13

질문의 나머지 절반에 답하려면 다음으로 전화하십시오.

return PartialView("viewname");

부분 HTML을 반환하려는 경우 URL 부분 / 매개 변수를 기반으로 요청이 JSON 또는 HTML을 원하는지 여부를 결정하는 방법을 찾아야합니다.


2
질문에 답이 남아 있지 않습니까?
Simon_Weaver

2
이것은 질문에 대답하지 않습니다.
Aaronaught

그는 PartialView를 사용하여 html을 가져 오기 위해 아약스 요청을 찾고있다. 아약스 호출을 사용하여 액션 메소드에서 뷰를 반환하지 않는 한 페이지 새로 고침이 필요하다
Chris McGrath

7

인코딩 프레임 워크가있는 대체 솔루션

액션 리턴 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())


4

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

이 작업에 대한 정보를 조금 더 추가 할 수 있습니까?
RealCheeseLord

코드 쇼 때문에 그것의 반환 JSON은 반환 형식은 JsonResult하지 ActionResult해야한다
noobprogrammer

0

요청에 따라 다른 출력을 생성하는 유연한 접근

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-With 헤더의 값이XMLHttpRequest 대부분의 브라우저 및 AJAX 프레임 워크에 의해 자동으로 추가됨).

Request.IsAjaxRequest () 확장 메소드와 같이 어디에서나 호출 할 수 있도록 요청이 json에 대한 것인지 여부를 확인하는 사용자 정의 확장 메소드 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.