[.net] ASP.NET MVC에서 View Model을 JSON 객체로 변환하는 방법은 무엇입니까?

.NET을 처음 접하는 Java 개발자입니다. 위젯을 래핑하기 위해 부분적으로보기를 원하는 .NET MVC2 프로젝트에서 작업하고 있습니다. 각 JavaScript 위젯 오브젝트에는 모델 데이터로 채워지는 JSON 데이터 오브젝트가 있습니다. 그런 다음이 데이터를 업데이트하는 메소드는 데이터가 위젯에서 변경되거나 해당 데이터가 다른 위젯에서 변경되는 경우 이벤트에 바인딩됩니다.

코드는 다음과 같습니다.

MyController:

virtual public ActionResult DisplaySomeWidget(int id) {
  SomeModelView returnData = someDataMapper.getbyid(1);

  return View(myview, returnData);
}

myview.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeModelView>" %>

<script type="text/javascript">
  //creates base widget object;
  var thisWidgetName = new Widget();

  thisWidgetName.updateTable = function() {
    //  UpdatesData
  };
  $(document).ready(function () {
    thisWidgetName.data = <% converttoJSON(model) %>
    $(document).bind('DATA_CHANGED', thisWidgetName.updateTable());
  });
</script>

<div><%:model.name%></div>

내가 모르는 것은 데이터를 SomeModelView다음 으로 전송 한 다음 위젯을 채우고 JSON으로 변환하는 데 사용할 수있는 방법입니다. 나는 컨트롤러에서 그것을 할 수있는 실제 간단한 방법을 보았지만보기에는 없었습니다. 나는 이것이 기본적인 질문이라고 생각하지만 나는 이것을 매끄럽게 만들려고 몇 시간 동안 갔다.



답변

면도기가 @Html.Raw(Json.Encode(object))있는 mvc3에서는 트릭을 수행하는 것 같습니다.


답변

이제 MVC를 사용하기 시작했고 첫 번째 주요 결함을 발견했습니다.

뷰에서 실제로 JSON으로 변환하고 싶지 않으며 컨트롤러에서 변환하지 않으려는 경우가 없습니다.이 두 위치 중 어느 것도 의미가 없습니다. 불행히도, 당신은이 상황에 갇혀 있습니다.

내가 찾은 가장 좋은 것은 JSON을 ViewModel의 뷰로 보내는 것입니다.

var data = somedata;
var viewModel = new ViewModel();
var serializer = new JavaScriptSerializer();
viewModel.JsonData = serializer.Serialize(data);

return View("viewname", viewModel);

그런 다음 사용

<%= Model.JsonData %>

당신의 관점에서. 표준 .NET JavaScriptSerializer는 매우 쓸모가 없습니다.

컨트롤러에서 그것을 수행하는 것은 적어도 테스트 가능하게 만듭니다 (위와 정확히 같지는 않지만-ISerializer를 종속성으로 사용하여 그것을 조롱 할 수 있습니다)

업데이트 또한, 자바 스크립트에 대한, 당신이 지금과 같은 위의 모든 위젯 JS를 포장하는 좋은 방법이 될 것입니다 :

(
    // all js here
)();

이 방법으로 한 페이지에 여러 위젯을 배치하면 충돌이 발생하지 않습니다 (페이지의 다른 곳에서 메소드에 액세스해야하는 경우가 아니라면 어쨌든 일부 위젯 프레임 워크로 위젯을 등록해야 함). 지금은 문제가되지 않지만 앞으로 요구 사항이 될 때 많은 노력을 절약하기 위해 지금 대괄호를 추가하는 것이 좋습니다. 또한 기능을 캡슐화하는 것이 좋습니다.


답변

나는 이것을 이렇게하는 것이 꽤 좋은 것을 알았습니다 (보기에서 사용법).

    @Html.HiddenJsonFor(m => m.TrackingTypes)

다음은 도우미 메소드 확장 클래스입니다.

public static class DataHelpers
{
    public static MvcHtmlString HiddenJsonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return HiddenJsonFor(htmlHelper, expression, (IDictionary<string, object>) null);
    }

    public static MvcHtmlString HiddenJsonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return HiddenJsonFor(htmlHelper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static MvcHtmlString HiddenJsonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
    {
        var name = ExpressionHelper.GetExpressionText(expression);
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

        var tagBuilder = new TagBuilder("input");
        tagBuilder.MergeAttributes(htmlAttributes);
        tagBuilder.MergeAttribute("name", name);
        tagBuilder.MergeAttribute("type", "hidden");

        var json = JsonConvert.SerializeObject(metadata.Model);

        tagBuilder.MergeAttribute("value", json);

        return MvcHtmlString.Create(tagBuilder.ToString());
    }
}

그것은 초현실적이지는 않지만 그것을 어디에 두어야하는지의 문제를 해결합니다 (컨트롤러 또는보기에서?)


답변

당신이 사용할 수있는 Json액션에서 직접 .

당신의 행동은 다음과 같습니다.

virtual public JsonResult DisplaySomeWidget(int id)
{
    SomeModelView returnData = someDataMapper.getbyid(id);
    return Json(returnData);
}

편집하다

방금 이것이 Model뷰의 것으로 가정 하여 위의 내용이 정확하지 않다면 Ajax컨트롤러 메소드를 호출해야합니다.ascx 그런 다음 모델 자체가 없어야합니다. 내 코드를 남겨 두겠습니다. 당신에게 유용하고 전화를 수정할 수있는 경우를 대비하여

편집 2
코드에 ID를 넣습니다.


답변

@ Html.Raw (Json.Encode (object))는 View Modal Object를 JSON으로 변환하는 데 사용할 수 있습니다


답변

Dave 의 훌륭한 답변 확장 . 간단한 HtmlHelper를 만들 수 있습니다 .

public static IHtmlString RenderAsJson(this HtmlHelper helper, object model)
{
    return helper.Raw(Json.Encode(model));
}

그리고 당신의 관점에서 :

@Html.RenderAsJson(Model)

이런 식으로 나중에 논리를 변경하려는 경우 JSON을 만들기 위해 논리를 중앙 집중화 할 수 있습니다.


답변

<htmltag id=’elementId data-ZZZZ’=’@Html.Raw(Json.Encode(Model))’ />

https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/를 참조 하십시오.

나는 아래에서했고 매력처럼 작동합니다.

<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>