以下是我的情况:我在ASP.NET中有一个UserBadge
对象,它包含3个字段,是User
个对象,Badge
个对象和boolean
( isNotified)检查用户是否收到了获得徽章的通知。我在发送此UserBadge
的具体WebMethod()
时遇到问题:
[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>
然后返回另一个WebMethod()
,在通知关闭后将isNotified boolean
设置为true:
[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,我以为我有,但我没有。
EDIT2:
现在解决了这个问题,我最终使用的是控制器而不是WebMethods
。
答案 0 :(得分:5)
您希望使用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()
{
}
答案 1 :(得分:1)
您真的想将对象传递给您的网络方法吗?为什么不传递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
编辑:从评论中明确表示它是一个ASP.NET MVC应用程序
由于它是ASP.NET MVC应用程序,您可以进行模型绑定。您可以序列化表单并通过jquery post将其发送到控制器操作。
如果您的页面具有“LogOnMOdel”并且您想要对UserBadge对象执行此绑定,则需要创建另一个具有2个属性的ViewModel,一个是LogonModel,另一个是UserBadge。然后将该视图模型传递到您的页面。
答案 2 :(得分:0)
好吧,终于在我兄弟的帮助和一些老式的锻炼中找到了它!我通过使用控制器而不是WebMethods
的代码隐藏来解决了这个问题。