我对jQuery和JavaScript相当陌生,但是我想向我编写的.NET Web服务提交电子邮件。我已经用数据中的一些简单值测试了Web服务,但是我希望我可以提交经过客户端和服务器端验证后填充服务器端的整个表。
这有效:
data: '{ strFrom: "[email protected]", to: "[email protected]", cc: "[email protected]", subject: "test subject", body: "test body" }'
但是,就像我说的那样,我已经在该表中填充了对表单的响应,并且当我执行var body = $(“#divSuccessDetails”)。html();时,并将其传递给而不是“测试正文”,我得到一个无效的对象响应。我已经测试了我选择的表的结果,它遵循以下原则:
<table id="ctl00_ContentPlaceHolder1_tblSuccessDetails" class="successDetails" style="width:80%;">
<tbody><tr>
<td class="successHeading" colspan="2">
Reporting Category
</td>
</tr>
<tr>
<td>
<span id="ctl00_ContentPlaceHolder1_lblBilling">Billing Provider: <b></b></span>
</td>
<td rowspan="1">
<span id="ctl00_ContentPlaceHolder1_lblCategory">Reporting Category: </span></td>
</tr>
<tr>
我的Web服务方法是这样的:
public string Email(string strFrom, string to, string cc, string subject, string body) {
try
{
MailMessage objMail = new MailMessage();
MailAddress from = new MailAddress(strFrom);
objMail.From = from;
objMail.To.Add(to);
objMail.CC.Add(cc);
objMail.Subject = subject;
objMail.Body = body;
SmtpClient smtp = new SmtpClient("pobox.abc.edu");
smtp.Send(objMail);
return "{\"form\": { \"successful\": \"true\" }}";
}
catch (Exception ex)
{
return "{\"form\": { \"successful\": \"false\" }, {\"exception\": {\"ex\": \"" + ex.Message + "\" }}";
}
}
我收到的错误消息大致如下:
"Invalid object passed in, ':' or '}' expected. (176): { strFrom: "[email protected]", to: "[email protected]", cc: "[email protected]", subject: "IDX Provider Form by IDX Provider Form by abcd", body: " <table id="ctl00_ContentPlaceHolder1_tblSuccessDetails" class="successDetails" style="width:80%;"> <tbody><tr> <td class="successHeading" colspan="2">
我只是希望将其作为字符串传递,因为那是我收到的。.我已经在用于电子邮件对象的字符串中放入了大量HTML,但这是我第一次尝试传递通过AJAX。
参考方案
如果您尝试将包含HTML元素的整个HTML表传递到Web服务,则会遇到HTML字符问题(例如,引号,双引号等)。您可以转义字符,但是我认为最好在HTML表中找到要发送的特定数据值并将它们分配给数据对象,因为这样只会导致发送“数据”与“标记和数据” 。如果将整个HTML表传递给服务器,则必须解析HTML文档以提取值。
作为一种替代解决方案,您可以post the FORM使用jQuery对其进行处理的页面。
$.post("FormProcessor.aspx", $("#testform").serialize());
[更新]
如果只想将表的HTML标记发送到服务器,则需要对结果进行HTML编码,然后将该值作为字符串值传递给服务器。
jQuery.fn.EncHTML = function () {
return String(this.html())
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
};
这是您将其与GridView一起使用的方式。
var html = $('#<%= Sample.ClientID %>').EncHTML();
这是对ASMX / WCF服务执行标准jQuery AJAX请求的方法。
$.ajax({
type: 'POST',
url: '/TableManager.asmx/Process',
data: JSON.stringify({ tableContents: html }),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
这将调用TableManager.asmx服务的“ Process”方法。它期望传递一个名为String的变量“ tableContetns”。它具有VOID的返回类型,因此没有任何内容发送回客户端/页面,但是可以将其更改为字符串,以便您可以发送回一条消息,说明已处理了表/数据。
注意:我还使用JSON.Org stringify函数正确地对发送到服务器的对象进行JSON编码。
这是服务器上的Web方法。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class TableManager : WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void Process(string tableContents)
{
var table = Server.HtmlDecode(tableContents);
// Do Something (Email, Parse, etc...).
}
}
从客户端拉回的表将不包含“ table”标签,因此您需要将它们自己扔掉。
.NET C#Webbrowser填充输入,不带ID或类名 - javascript我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…
jQuery发布不会将数据发布到ASP.NET API控制器 - javascript我有一次噩梦般的时间通过jquery post将数据发送到ASP.NET Controller。这是JSON.stringify之后的数据:[{"scheduleTaskID":"203","task":"Permit","baselineDate":…
asp.net mvc中的对象数组数据始终为null - javascript我需要通过json将对象数组发送到asp.net mvc 2,但是我在mvc控制器中没有得到null对象是这样的entries[1].date = "12/22/2014" entries[1].Ref = "0002" entries[1].Credit = "100" entries[2].da…
jQuery ajax()返回json对象,但未正确警告 - php为什么无法使用data [0] .id返回ID? $(document).ready(function(){ $.ajax({ type: 'POST', dataType: "json", url: '<?php echo matry::base_to('tests/map_it'…
ddl在服务器中未更新-asp.net - javascript我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……