当前位置: 首页 > 面试题库 >

如何使用JSON将复杂类型传递给ASP.NET MVC控制器

谭志用
2023-03-14
问题内容

我有一个视图,允许用户输入/编辑新窗口小部件的数据。我想将这些数据组成一个json对象,然后通过AJAX将其发送到我的控制器,这样我就可以在服务器上进行验证而无需回发。

我已经完成了所有工作,但是我无法弄清楚如何传递数据,因此我的控制器方法可以接受复杂的Widget类型,而不是每个属性的单个参数。

因此,如果这是我的对象:

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");

我的表单(Form1)在窗口小部件上的每个属性(ID,名称,价格)都有一个输入字段。这很好用,但是最终它将小部件的每个属性作为单独的参数传递给我的控制器方法。

有没有一种方法可以“拦截”数据(可能使用ActionFilterAttribute),然后在调用控制器方法之前将其反序列化为Widget对象?


问题答案:

谢谢杰夫,这使我走上了正确的道路。DefaultModelBinder足够聪明,可以为我做所有的魔术…我的问题出在我的Widget类型中。匆忙中,我的类型定义为:

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; }
    }
}


 类似资料:
  • 我正在开发将复杂数据从window.open()传递到MVC Controller action方法参数的javascript功能。我能够通过构建查询字符串并从控制器中的[FromQuery]检索它们来实现它。 但我的问题是,我想将数据作为模型对象传递。在窗户里可以吗。打开() 下面是我的javascript代码 如您所见,我可以在URL中传递数据,但它似乎是公开的。那么,有没有办法传入var u

  • 问题内容: 我试图通过ajax调用将模型传递给控制器​​。 我已经看过Laviak在以下问题中提供的答案,但无法使其正常工作。 运行ajax调用时,MODEL变量出现未定义的错误。我已经确认正在调用助手类,并且正在返回字符串。是否因为AJAX调用位于.js文件中?为什么未定义? 我的代码: Site.Master: 助手类: Javascript文件: 动作方法: 问题答案: 确保在主文件中定义变

  • 问题内容: 我想将一个对象传递给控制器​​,并在控制器中检索值。我定义如下: HTML代码: Javascript: 但是我无法在控制器中检索值。它越来越空。 问题答案: 尝试以下操作:-您正在传递对象数组,因此您应该执行HTTPPost而不是HttpGet(这将适用于通过查询字符串发送它的原始类型数组,例如int,strgin等列表)(请记住查询字符串的限制)。尝试使用HTTPPost

  • 问题内容: 如何将ID从此Ajax调用传递给TestController getAjax()函数?当我打电话时,网址是testUrl?id = 1 TestController.php 问题答案: 最后,我只是将参数添加到Route :: get()以及ajax url调用中。我在getAjax()函数中将$ _POST [‘id’]更改为$ _GET [‘id’],这使我的回复 TestCont

  • 我有一个包含函数列表的jsp页面。在控制器中,我从数据库中获取此列表并将其传递给jsp。 在我的jsp页面中,我使用以下函数列表创建表 我还将函数id赋予复选框id。 我的功能实体如下 我想按保存按钮并进入控制器“/函数列表/保存”我的复选框值列表。

  • 根据本指南,我能够将简单数据类型(如)的关联数组传递给PL/SQL过程。 可以这么说: 但是,我想调用下面的过程,取而代之的是复杂类型。 我尝试过各种方法,比如: 以下是失败的: 看起来您可以在包之外创建一个类型并引用它。 引用它: 但是,您不允许在包之外创建关联数组的RECORD。我可以用对象替换RECORD,但是我想不出任何东西可以替换关联数组,这是cx_Oracle可以传入或传出的唯一集合类