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.Json
JSON으로 .
@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
'source' 카테고리의 다른 글
스프링 부트: Spring Boot Servlet이니셜라이저는 권장되지 않습니다. (0) | 2023.04.04 |
---|---|
AngularJS 실패한 리소스 GET (0) | 2023.04.04 |
Angular에서 모듈과 네임스페이스/이름 충돌JS (0) | 2023.04.04 |
ReferenceError getValuesOf자동 채우기 입력, 변수를 찾을 수 없습니다.지불자동 채우기 구성 (0) | 2023.03.25 |
대응 16 경고 "warning.js:36 경고: 서버 HTML에 다음이 포함될 것으로 예상하지 않았습니다.대응 16 경고 "warning.js:36 경고: 서버 HTML에 다음이 포함될 것으로 예상하지 않았습니다.에에." (0) | 2023.03.25 |