[.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))'>