我的项目中有这个代码:
var UI =
{
Layouts:
{
ShowLayoutSettings: function(pid, lid) {
My.PageServices.GetPageLayout(lid, pid, UI.Layouts._onShowLayoutSettings);
},
_onShowLayoutSettings: function(obj) {
alert(obj.ID);
}
}
}
在我的asp.net项目中有一个名为PageServices的Web服务:
namespace My
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class PageServices : System.Web.Services.WebService
{
public PageServices()
{
}
[WebMethod]
[ScriptMethod(UseHttpGet = false, XmlSerializeString = true)]
[GenerateScriptType(typeof(PageLayout))]
public PageLayout GetPageLayout(string lid, int pid)
{
if (!SystemModel.UserManager.HasLogin())
return null;
var o = SystemModel.Layouts.GetPageLayout(pid);
o.Tag = lid;
return o;
}
}
}
我应该提一下,我的PageLayout类是一个linq类,它的序列化模式是单向的。
最后是锚链接:
<a href="#" onclick="UI.Layouts.ShowLayoutSettings(5,2);">Test</a>
我的问题是它是正确的,当我点击此链接时,我向我的服务发送ajax请求,我的服务根据需要返回该对象,但它不会激活_onShowLayoutSettings作为此请求的回调函数。
当我创建一个刚刚返回的Web服务器和String对象时,我测试了这项工作,这一切都是正确的,但我不知道为什么我的PageLayout对象,它不正确。
请帮帮我。 谢谢。
答案 0 :(得分:1)
如果它返回一个字符串,那么你可能需要告诉ajax扩展为你想要返回的对象创建javascript代码。在webmethod
上方添加一个属性[GenerateScriptType(typeof(PageLayout))]
其中PageLayout是GetPageLayout返回的类的名称
答案 1 :(得分:0)
我找到了解决方案,但是很难,我写了一个名为PageLayoutJavaScriptConverter的JavaScriptConverter:
public class PageLayoutJavaScriptConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get
{
return new Type[] { typeof(PageLayout) };
}
}
public override object Deserialize(
IDictionary<string, object> dictionary,
Type type,
JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(
object obj,
JavaScriptSerializer serializer)
{
PageLayout e = obj as PageLayout;
Dictionary<string, object> result = new Dictionary<string, object>();
if (e != null)
{
result.Add("ID", e.ID);
}
return result;
}
}
并将此标记添加到web.config:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="PageLayoutJavaScriptConverter" type="WebApp.Code.PageLayoutJavaScriptConverter"/>
</converters>
</jsonSerialization>
</webServices>
<scriptResourceHandler enableCaching="true" enableCompression="true"/>
</scripting>
</system.web.extensions>
一切都是正确的。
我有一个问题,是不是还有其他更简单的方法来做这项工作?