我可以通过 ASP.NET 将对象从客户端 javascript 发送到服务器端代码吗?

Posted

技术标签:

【中文标题】我可以通过 ASP.NET 将对象从客户端 javascript 发送到服务器端代码吗?【英文标题】:Can I send an object from client-side javascript to server-side code via ASP.NET? 【发布时间】:2011-08-30 21:40:11 【问题描述】:

【问题讨论】:

【参考方案1】:

在 ASP.NET WebForms 中,我会使用 ScriptService:

查看此示例:http://msdn.microsoft.com/en-us/magazine/cc163499.aspx

GenerateScriptType 属性可以用于如果你想传递/获取洞对象给服务: ASP.NET ScriptService deserialization problem with derived types

[WebService(Namespace = "http://msdnmagazine.com/ws")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[GenerateScriptType(typeof(Object1))]
[GenerateScriptType(typeof(Object2))]
[ScriptService]
public class StockQuoteService : WebService

    static Random _rand = new Random(Environment.TickCount);

    [WebMethod]
    public int GetStockQuote(string symbol)
    
        return _rand.Next(0, 120);
    

【讨论】:

您的示例显示了如何调用 Web 服务并传递单个值,但它没有显示如何传递对象(包括属性)。【参考方案2】:

是的。一种方法是使用网络方法;例如:

    创建服务 从 javascript 方法调用,例如:DataService.Push(yourObject);

例如:

Javascript 方法:

function btnGenerate_onclick(result) 
    DataService.Push(getDataFromSomeDiv(), onGenerateReportComplete /*callback method*/);
    //or
    //DataService.Push(document.getElementById("myDiv").innerhtml, onGenerateReportComplete /*callback method*/);



function onGenerateReportComplete(result) 
            alert("Success:" + result);

服务方式:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class DataService : System.Web.Services.WebService


    [WebMethod(EnableSession = true)] //If you want?
    public bool Push(object someObject)
    
        //var v = someObject as MyObjectClass;//Process object 
        return true;
    

编辑:javascript如何知道什么是服务器端DataService?

这需要在标记中引用 Web 服务。比如下面这样:

<asp:ScriptManager ID="sm" runat="server">
            <Services>
            <asp:ServiceReference Path="DataService.asmx" />
        </Services>
</asp:ScriptManager>

或者你可以使用回调/page methods。

【讨论】:

你错过了什么。 javascript 如何知道什么是服务器端 DataService?【参考方案3】:

并非如此。您可以将对象序列化为字符串,将该字符串发送到 ASP.NET,然后在另一端再次将其转换为对象。

JSON 是一种很好的序列化格式,您可以将简单的对象直接放入它周围的各种库中(即listed in the penultimate section of the JSON homepage)。

对于更复杂的对象,您需要先提取需要重新创建它们的相关数据位。

【讨论】:

【参考方案4】:

Ben Dotnet 关于在 asp.net WebForms 中使用 ScriptService 是正确的。除了使用 ScriptService 装饰器之外,GenerateScriptType 装饰器也很重要,以确保包含您想要使用的复杂类型。我发现除了这篇文章之外,Ben 链接的文章也很有用:http://www.webreference.com/programming/asp-net-ajax/complex-data-types/index.html

这就是我如何能够完全按照您正在尝试的方式进行操作。首先,我定义了我想在代码隐藏文件中使用的自定义类型。

namespace TestProject

    public class SampleData
        
            public int id  get; set; 
            public string StartDate  get; set; 
            public string EndDate  get; set; 

            public SampleData()
             
    
    public partial class SamplePage : System.Web.UI.Page
    
        /* The rest of the SamplePage.aspx.cs file goes here */
    

然后我在我的 SamplePage 代码中创建了一个 WebMethod/ScriptMethod,如下所示:

[WebMethod]
[ScriptMethod]
[GenerateScriptType(typeof(SampleData))]
public static bool EditReminder(SampleData data)

    /* Server side code goes here */
    return true;

然后,在客户端页面上,我能够创建一个 SampleData 类型的对象,并像这样使用 PageMethods 传递它。 不要忘记包含命名空间,这是必要的。

function some_javascript_function () 
    var sample_data = new TestProject.SampleData()
    sample_data.id = 1;
    sample_data.StartDate = '6/24/1976';
    sample_data.EndDate = '3/20/2012';
    PageMethods.EditReminder(sample_data, OnEditReminderComplete)


function OnEditReminderComplete () 
    if (result) alert("Success!");
    else alert("Failure!");

另外,不要忘记在页面的某处包含脚本管理器并启用这样的页面方法:

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

【讨论】:

【参考方案5】:

是的。您可以使用 Json 并执行 POST。如果您使用的是 jQuery,则可以使用 $.ajax 将值发布到服务器端。希望这会有所帮助。

【讨论】:

你能告诉我更多关于 Json 的信息吗(解释,例子)? 这是一个很好的参考点haacked.com/archive/2010/04/15/…

以上是关于我可以通过 ASP.NET 将对象从客户端 javascript 发送到服务器端代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将asp.net的printeventargs对象传递给javascript

如何将复杂的参数发送到 asp.net

Asp.Net:将数据从 WCF 服务广播到 Asp.Net 客户端的最佳方式

ASP.NET 将响应保存到 global.asax 中的文件

保存对话框以下载文件,将文件从 ASP.NET 服务器保存到客户端

从控制器事件(无客户端请求)向视图发送数据 ASP.NET MVC 4