在ASP.NET中通过jQuery/ajax获取复杂对象
本文关键字:ajax 获取 复杂 对象 jQuery ASP NET | 更新日期: 2023-09-27 18:20:21
我的情况是:我在ASP.NET中有一个UserBadge
对象,它包含3个字段,分别是User
对象、Badge
对象和boolean
(isNotificationd),用于检查用户是否已收到获得徽章的通知。我从这个WebMethod()
:发送特定的UserBadge
时遇到问题
[WebMethod()]
public static UserBadge Notify()
{
var db = new achievDb();
foreach (var uB in db.UserBadges)
{
if (System.Web.HttpContext.Current.User.Identity.Name == uB.User.UserName)
{
if (!uB.isNotified)
{
return uB;
}
}
}
return null;
}
到我的$.ajax
:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: "../NotifCodeBehind.aspx/Notify",
data: "{}",
complete: function (result) {
if (result) {
$("#notify").jGrowl("You've unlocked a badge!", { header: 'Yay', close: function () {
$.ajax({
type: "POST",
url: "../NotifCodeBehind.aspx/Notified",
data: "{}",
success: function (ub) { DoCallback(JSON.stringify(ub)); },
error: function () { DoCallback("NOPE!") }
});
}
})
};
function DoCallback(msg) {
alert(msg);
}
}
})
})
</script>
然后返回到另一个CCD_ 8,该CCD_
[WebMethod()]
public static void Notified(UserBadge ub)
{
var db = new achievDb();
foreach (var userbadge in db.UserBadges)
{
if (userbadge.UserId == ub.UserId && userbadge.BadgeId == ub.UserId)
{
userbadge.isNotified = true;
db.SaveChanges();
}
}
}
问题:我完全不知道如何将对象真正传递给ajax,然后再返回。。。我花了大约1.5天的时间在网上浏览,但现在,我决定来寻求帮助。我读得越多,它就越让我困惑,我是jQuery/Ajax/JSON的绝对新手。
所以,如果你能让它尽可能简单,并推动我朝着正确的方向前进,我将不胜感激!
编辑:下面的新JavaScript,我以为我有,但我没有。
第2版:现在这个问题已经解决了,我最终使用了一个控制器而不是WebMethods
。
您希望使用JSON序列化。当您将结果返回到ajax回调方法时,web方法可以以XML、JSON或字符串的形式返回结果。如果您返回一个JSON,那么您的复杂对象将以非常直接的方式转换为JSON对象。
假设你的阶级结构
class UserBadge
{
User UserProperty { get; set; }
Badge BadgeProperty { get; set; }
bool IsNotified { get; set; }
}
class User
{
string Username { get; set; }
}
结果回调函数中javascript中的json对象看起来像
{
UserProperty: { Username: "some username" },
BadgeProperty: { /**********/ },
IsNotified: true
}
正如您所看到的,JSON结构与类对象结构相同。因此,用javascript调用result.UserProperty.Username
是完全可以的。构造相同的对象并将其传递给另一个ajax web服务将把JSON对象转换为托管类对象。
编辑:您可以将ScriptMethodAttribute添加到WebMethod中以指定JSON响应。
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static UserBadge Notify()
{
}
您真的想将对象传递给您的web方法吗?如果需要的话,为什么不传递Id(UserId、badgeId等)并使用这些Id在ajax服务器页面中构建对象呢。您可以将Id作为查询字符串值进行传递。
var userId=4 // read from some hidden items or somewhere
var badgeid=3 // read from somewhere
$.ajax({
type: "POST",
url: "../NotifCodeBehind.aspx/Notify?uid="+userId+"&bid="+badgeId,
data: "{}",
complete: function (result) {
// rest of the code
EDIT:从评论中可以清楚地看出,它是一个ASP.NET MVC应用程序
由于它是一个ASP.NET MVC应用程序,因此可以进行模型绑定。您可以序列化您的表单,并通过jquerypost将其发送到控制器操作。
如果您的页面有一个"LogOnMOdel",并且您也想为UserBadge对象执行此绑定,则需要创建另一个具有两个属性的ViewModel,一个是LogOnMOdel,另一个是UserBadge。然后将该视图模型传递到您的页面。
在我哥哥的帮助下,通过一些老式的锻炼,终于找到了答案!我通过使用控制器而不是WebMethods
的代码隐藏来解决这个问题。