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

时间:2011-05-23 05:54:33

标签: c# javascript asp.net vb.net

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

    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

答案 2 :(得分:2)

不是这样的。您可以将对象序列化为字符串,将该字符串发送到ASP.NET,然后再将其转换为对象。

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

对于更复杂的对象,在执行此操作之前,您需要提取重新创建它们所需的数据的相关位。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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" />