json을 사용하여 복잡한 유형을 ASP에 전달하는 방법.NET MVC 컨트롤러
사용자가 새 위젯의 데이터를 입력하거나 편집할 수 있는 보기가 있습니다.이 데이터를 json 객체로 만들어 AJAX를 통해 컨트롤러로 전송하여 포스트백 없이 서버에서 검증을 수행할 수 있도록 하고 싶습니다.
데이터를 전달할 수 없기 때문에 컨트롤러 방법이 각 속성에 대한 개별 매개 변수가 아닌 복잡한 위젯 유형을 수용할 수 있다는 점을 제외하고는 모두 작동했습니다.
그래서 이게 내 목적이라면:
public class Widget
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
컨트롤러 방식을 다음과 같이 만들고 싶습니다.
public JsonResult Save(Widget widget)
{
...
}
현재 jQuery는 다음과 같습니다.
var formData = $("#Form1").serializeArray();
$.post("/Widget/Save",
formData,
function(result){}, "json");
내 양식(양식1)에는 위젯의 각 특성(아이디, 이름, 가격)에 대한 입력 필드가 있습니다.이 방법은 잘 작동하지만 위젯의 각 속성을 별도의 매개 변수로 컨트롤러 메서드에 전달합니다.
컨트롤러 메서드가 호출되기 전에 ActionFilterAttribute를 사용하여 데이터를 "감청"하고 위젯 개체로 역직렬화할 수 있는 방법이 있습니까?
고마워요, 제프. 그게 날 올바른 길로 이끌었네요.Default Model Binder는 모든 마법을 대신할 수 있을 정도로 스마트합니다.제 문제는 위젯 타입이었습니다.급하게 내 타입은 다음과 같이 정의되었다.
public class Widget
{
public int Id;
public string Name;
public decimal Price;
}
유형에는 공용 속성 대신 공용 필드가 있습니다.일단 그것들을 부동산으로 바꾸자 효과가 있었다.다음은 올바르게 동작하는 최종 소스 코드입니다.
Widget.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Widget.aspx.cs" Inherits="MvcAjaxApp2.Views.Home.Widget" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<script src="../../Scripts/jquery-1.2.6.js" type="text/javascript"></script>
<script type="text/javascript">
function SaveWidget()
{
var formData = $("#Form1").serializeArray();
$.post("/Home/SaveWidget",
formData,
function(data){
alert(data.Result);
}, "json");
}
</script>
<form id="Form1">
<input type="hidden" name="widget.Id" value="1" />
<input type="text" name="widget.Name" value="my widget" />
<input type="text" name="widget.Price" value="5.43" />
<input type="button" value="Save" onclick="SaveWidget()" />
</form>
</asp:Content>
HomeController.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcAjaxApp2.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
ViewData["Title"] = "About Page";
return View();
}
public ActionResult Widget()
{
ViewData["Title"] = "Widget";
return View();
}
public JsonResult SaveWidget(Widget widget)
{
// Save the Widget
return Json(new { Result = String.Format("Saved widget: '{0}' for ${1}", widget.Name, widget.Price) });
}
}
public class Widget
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
(Mr.Dustpan 솔루션에서는) MVC Action 메서드의 파라미터 이름 위젯은 ASPX 파일의 이름 속성에 사용되는 접두사와 일치해야 합니다.
그렇지 않은 경우 Action 메서드는 항상 null 개체를 수신합니다.
<input type="text" name="widget.Text" value="Hello" /> - OK
<input type="text" name="mywidget.Text" value="Hello" /> - FAILS
Phil Hack은 모델 바인딩에 대한 좋은 블로그 게시물을 가지고 있는데 도움이 될 수 있습니다.100%는 아니지만 Default Model Binder에 대해 전반적으로 더 잘 이해할 수 있을 것 같습니다.
javascript 폼 오브젝트를 백엔드 오브젝트가 구조화되어 있는 것과 같은 방법으로 구조화하려고 합니다.
{ Id : "id", Name : "name", Price : 1.0 }
그런 다음 toJ를 사용합니다.SON 플러그인을 위 문자열로 변환합니다.이 문자열을 백엔드로 보내고 JayRock 라이브러리와 같은 것을 사용하여 새 위젯 개체로 변환합니다.
언급URL : https://stackoverflow.com/questions/267707/how-to-pass-complex-type-using-json-to-asp-net-mvc-controller
'programing' 카테고리의 다른 글
Oracle 더하기(+) 표기법과 ANSI JOIN 표기법의 차이점 (0) | 2023.03.08 |
---|---|
반응 - 여러 참조 전달 (0) | 2023.03.08 |
스프링 주석 @Controller는 @Service와 동일합니까? (0) | 2023.03.03 |
wpdb를 사용하여 데이터를 삽입하는 방법 (0) | 2023.03.03 |
Angular JS, 해결 및 알 수 없는 공급자 (0) | 2023.03.03 |