source

ASP에서 View Model을 JSON 개체로 변환하는 방법.NET MVC?

nicesource 2023. 4. 4. 21:24
반응형

ASP에서 View Model을 JSON 개체로 변환하는 방법.NET MVC?

저는 자바 개발자로, 를 처음 접하는 사람입니다.NET. 작업 중입니다.위젯을 래핑하기 위해 부분 보기를 원하는 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으로 변환할 수 있습니다.컨트롤러에서는 매우 간단한 방법을 볼 수 있었지만 뷰에서는 볼 수 없었습니다.이게 기본적인 질문이라고 생각하지만 난 이걸 부드럽게 하려고 몇 시간째 노력하고 있어.

면도기가 있는 mvc3에서@Html.Raw(Json.Encode(object))효과가 있는 것 같아요

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

뷰에서 JSON으로 변환하거나 컨트롤러에서 변환하거나 둘 다 의미가 없기 때문에 변환하고 싶지 않습니다.불행히도, 당신은 이 상황에 갇혀 있어요.

가장 좋은 방법은 다음과 같이 뷰 모델의 뷰에 JSON을 전송하는 것입니다.

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

return View("viewname", viewModel);

그 후

<%= Model.JsonData %>

당신이 보기엔.표준이 되는 것에 주의해 주세요.NET JavaScript Serializer는 꽤 엉망입니다.

컨트롤러로 하면 적어도 테스트 가능해진다(상기와는 달리 ISerializer를 의존관계로 채택하여 조롱할 수 있다).

또한 JavaScript와 관련하여 위의 모든 위젯 JS를 다음과 같이 랩하는 것이 좋습니다.

(
    // all js here
)();

이렇게 하면 한 페이지에 여러 위젯을 배치하면 충돌이 발생하지 않습니다(페이지의 다른 위치에서 메서드에 액세스할 필요가 없는 한). 이 경우 위젯을 위젯 프레임워크에 등록해야 합니다.지금은 문제가 되지 않을지도 모르지만, 향후 필요하게 되었을 때 수고를 덜기 위해 지금 괄호를 추가하는 것도 좋은 방법이며, 기능을 캡슐화하는 것도 좋은 OO 연습입니다.

이렇게 하는 것이 꽤 좋다고 생각했습니다(뷰에서의 사용법).

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

다음으로 도우미 메서드의 Extension 클래스를 나타냅니다.

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).인코딩(개체)을 사용하여 View Modal 개체를 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))'>

Andrew는 좋은 반응을 보였지만, 나는 그것을 조금 트윗하고 싶었다.다른 점은 Model Views에 오버헤드 데이터가 없는 것이 좋다는 것입니다.객체에 대한 데이터만.View Data는 오버헤드 데이터에 적합한 것 같습니다만, 물론 저는 이 일에 익숙하지 않습니다.저는 이런 걸 하는 게 좋아요.

컨트롤러

virtual public ActionResult DisplaySomeWidget(int id)
{
    SomeModelView returnData = someDataMapper.getbyid(1);
    var serializer = new JavaScriptSerializer();
    ViewData["JSON"] = serializer.Serialize(returnData);
    return View(myview, returnData);
}

보다

//create base js object;
var myWidget= new Widget(); //Widget is a class with a public member variable called data.
myWidget.data= <%= ViewData["JSON"] %>;

이를 통해 JSON에 ModelView와 동일한 데이터가 제공되므로 컨트롤러에 JSON을 반환할 수 있으며 모든 부품이 포함됩니다.이는 단순히 JSONRequest를 통해 요구하는 것과 비슷하지만 콜이 1개 줄어들기 때문에 오버헤드를 줄일 수 있습니다.그나저나 이건 데이트에게 펑키하지만 그건 또 다른 실타래 같아.

ASP asp asp 。3.1 에서는 NET Core 3.1 을 사용할 수 .System.Text.JsonJSON으로 .

@using System.Text.Json

...

@section Scripts {
    <script>
        const model = @Html.Raw(JsonSerializer.Serialize(Model));
    </script>
}

언급URL : https://stackoverflow.com/questions/3365551/how-to-convert-view-model-into-json-object-in-asp-net-mvc

반응형