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(1);
return Json(returnData);
}
편집하다
Just saw that you assume this is the Model
of a View so the above isn't strictly correct, you would have to make an Ajax
call to the controller method to get this, the ascx
would not then have a model per se, I will leave my code in just in case it is useful to you and you can amend the call
@Html.Raw(Json.Encode(object)) can be used to convert the View Modal Object to JSON
<htmltag id=’elementId’ data-ZZZZ’=’@Html.Raw(Json.Encode(Model))’ />
Refer https://highspeedlowdrag.wordpress.com/2014/08/23/mvc-data-to-jquery-data/
I did below and it works like charm.
<input id="hdnElement" class="hdnElement" type="hidden" value='@Html.Raw(Json.Encode(Model))'>
Extending the great answer from Dave. You can create a simple HtmlHelper.
public static IHtmlString RenderAsJson(this HtmlHelper helper, object model)
{
return helper.Raw(Json.Encode(model));
}
And in your view:
@Html.RenderAsJson(Model)
This way you can centralize the logic for creating the JSON if you, for some reason, would like to change the logic later.
Andrew had a great response but I wanted to tweek it a little. The way this is different is that I like my ModelViews to not have overhead data in them. Just the data for the object. It seem that ViewData fits the bill for over head data, but of course I'm new at this. I suggest doing something like this.
Controller
virtual public ActionResult DisplaySomeWidget(int id)
{
SomeModelView returnData = someDataMapper.getbyid(1);
var serializer = new JavaScriptSerializer();
ViewData["JSON"] = serializer.Serialize(returnData);
return View(myview, returnData);
}
View
//create base js object;
var myWidget= new Widget(); //Widget is a class with a public member variable called data.
myWidget.data= <%= ViewData["JSON"] %>;
What This does for you is it gives you the same data in your JSON as in your ModelView so you can potentially return the JSON back to your controller and it would have all the parts. This is similar to just requesting it via a JSONRequest however it requires one less call so it saves you that overhead. BTW this is funky for Dates but that seems like another thread.
'Programing' 카테고리의 다른 글
저자를 변경하기 위해 Git에서 여러 커밋을 수정하는 방법 (0) | 2020.06.10 |
---|---|
장고 클래스 기반 뷰에서 permission_required 데코레이터를 사용하는 방법 (0) | 2020.06.10 |
Guzzle 6 : 응답을위한 더 이상 json () 메소드 (0) | 2020.06.10 |
프로그래밍 방식으로 축소 또는 축소 축소 도구 모음 레이아웃 (0) | 2020.06.10 |
Clojure에 목록에 특정 값이 포함되어 있는지 테스트 (0) | 2020.06.09 |