programing

json을 사용하여 복잡한 유형을 ASP에 전달하는 방법.NET MVC 컨트롤러

starjava 2023. 3. 8. 20:31
반응형

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

반응형