2015-01-05 3 views
1

자바 스크립트를 사용하기 위해 JSON 객체로 변환해야하는 서버 생성 객체가 있습니다. 추가 HTTP 요청을 방지하기 위해 뷰가 렌더링 될 때이 JSON 객체를 JS 변수에 직접 렌더링하는 것을 선호합니다.면도기에서 JsonResult를 문자열로 렌더링

public virtual JsonResult GetTheThings() 
{ 
    return Json(new 
    { 
     foo = "hello world", 
     bar = 3, 
    }, JsonRequestBehavior.AllowGet); 
} 

내가 직접 http://localhost:32243/MyController/GetTheThings에서이 액세스 할 수 있으며 나는 내 브라우저에서 렌더링 다음 얻을 :

이 내 컨트롤러입니다. {"foo":"hello world", "bar":3}. 완전한!

이제 기본적으로이 뷰의 결과를 문자열로 렌더링하려고합니다. 어떻게해야합니까? 아래에있는 내용은 이 아니며 작업은 아니지만 잘하면이 아이디어를 제공합니다.

이 내 시도 나는 또한 T4 템플릿을 사용하고

<script> 
    var myObj = @Html.RenderPartial(MVC.MyController.GetTheThings()); 
</script> 

주입니다.

결국, 이것은 뷰에서 렌더링되기를 원합니다.

<script> 
    var myObj = {"foo":"hello world", "bar":3}; 
</script> 
+0

:

public ActionResult Index() { return View(new ModelToSerialize()); } 

은 다음과 같은보기에 사용 그게 전혀 작동하지 않습니다 –

+0

그냥'var myObj = MVC.MyController.GetTheThings();'시도 했습니까? – Shoe

+0

아니면'Html.Partial' ... –

답변

0

당신은 theoritically 이런 식으로 할 수있을 것입니다 :

<script> 
    var myObj = json.parse('@Html.RenderPartial(MVC.MyController.GetTheThings());'); 
</script> 

GetTheThings() 실제로 여기에 발생하지 않습니다,하지만, 그냥 T4MVC 자리입니다. 당신은 아마 당신의 가치를 뷰 모델에 저장하고 아래의 자바 스크립트로 가져와야합니다. 이 값을 얻기 위해 컨트롤러를 별도로 호출하려면 Ajax 호출이 필요합니다.

public class MyController 
{ 
    public ActionResult MyView(){ 
     var vm = new MyViewModel(); 
     vm.MyObjectAsJsonString = GetMyJsonString(); 
     return View(vm); 
    } 
    public string GetMyJsonString(){ 
     return ""; //get your json 
    } 
} 

public class MyViewModel 
{ 
    public string MyObjectAsJsonString{ get; set; } 
} 

@model MyViewModel 
<script> 
    var myObj = json.parse('@Model.MyObjectAsJsonString'); 
</script> 

는 아약스를 통해 작업을 수행하려면 : 당신은 단지보기 (AJAX를 호출에서가 아니라) 렌더링 될 때 객체가 렌더링 할 때문에

<script> 
    $.ajax({ 
     url: '@Url.Action(MVC.MyController.GetTheThings())', 
     type: 'get', 
    }).done(function (result){ 
     var myObj = result; 
    }); 
</script> 
+0

json 객체를 파싱하는 데 문제가 없습니다. MVC를 렌더링하는 데 문제가 있습니다. 여기서보기. 또한 위에서 언급했듯이 추가 HTTP 요청을 피하기 위해 다른 AJAX 호출 대신 뷰에서 렌더링하려고합니다. –

+0

아약스 호출없이이 작업을 수행 할 수 있지만 뷰 모델에 저장해야합니다. 뷰는 컨트롤러를 직접 호출 할 수 없으며 뷰가 렌더링 될 때 컨트롤러가 이미 사용 중입니다. – DLeh

+0

보기 모델에서 json을 구문 분석하는 방법에 대한 예는 내 편집을 참조하십시오. – DLeh

2

이, 가장 좋은 건 아마 할 것입니다 그것은 당신 모델의 일부입니다. 문자열 속성을 만들고 JSON을 문자열로 저장 한 다음보기에서 JSON.parse을 사용하여 개체로 변환하십시오.

예 : AJAX를 통해 객체를 요구하지 않기 때문에

<script> 
    var myObj = JSON.parse("@Html.Raw(Model.JsonString)"); 
</script> 

많은 청소기 그런 식으로, 정말 가지고 좋은 이유가없는 컨트롤러는이 일을.

+0

하지만 내 컨트롤러에서 JSON 문자열을 가져 오는 방법은 무엇입니까? 이것은 나의 주요 질문이다. –

+1

왜 컨트롤러에서 필요합니까? 컨트롤러는 실제로 애플리케이션 요청을 처리하는 것이 아니라 HTTP 요청 만 처리해야합니다. –

+0

흠 ... 네가 맞을지도 모른다. 감사. 다른 방식으로이 일을하려고합니다. –

0
<script> 
    var myObj = '@Html.RenderPartial("Getthethings","controller name");' 
</script> 
+0

감사합니다. 그러나이 작업을 수행하면이 프로젝트에서 사용하는 강력한 형식의 T4 템플릿이 무시됩니다. –

0

@ Html.Raw (...) 래퍼를 사용하십시오.

내 자신의 프로젝트에서 나는 컨트롤러 자체에서 나오는 기존 모델을 참조하지만 부분적으로 동일한 효과를 얻을 수있는 이유는 없습니다. 단지 핵심 목적이 아닙니다. 비동기 호출을 사용하여 ... 당신은 html 렌더링 엔진에 의존하지 말고 '더러운'작업을 수행해야합니다.

1

이렇게하면 HtmlHelper 확장을 생성 할 수 있으며 JsonResult를 사용하는 대신 강력한 형식의 뷰 (JSON을 사용한다고 가정)를 사용하십시오.) 순 :

public static class HtmlHelperEx 
{ 
    public static string ToJson(this HtmlHelper html, object obj) 
    { 
     return JsonConvert.SerializeObject(obj); 
    } 
} 

컨트롤러 조치 : Html.Action``으로 시도 할 수 있습니다하지만 난 잘 모르겠어요

@model ModelToSerialize 

<script type="text/javascript"> 
    var myObj = @Html.ToJson(Model) 
</script> 
+0

완벽한 솔루션. 그리고 HTML을 반환하기 전에 모델을 JSON처럼 사용할 수 있습니다. @ Html.Raw (@ Html.ToJson (Model))를 추가하기 만하면됩니다. json의 htmlencoding을 피하십시오. –

관련 문제