现在的位置: 首页 > 综合 > 正文

MVC学习之AJAX实现提交后的响应

2012年04月24日 ⁄ 综合 ⁄ 共 2814字 ⁄ 字号 评论关闭
显示用户是否已经回复了
用户访问/Dinners/Details/[id] URL,可以查看特定Dinner的详细信息。关于Details action方法的实现,也不在这里描述了。
实现RSVP支持的第一步是在Dinner对象(Dinner.cs partial 类)中添加一个IsUserRegistered(username) 的辅助方法,该方法基于是否用户已经回复了该Dinner晚宴,显示true或false。
public partial class Dinner {
public bool IsUserRegistered(string userName) {
return RSVPs.Any(r => r.AttendeeName.Equals(userName,
StringComparison.InvariantCultureIgnoreCase));
}
}
 
接着添加如下代码到Details.aspx 视图模板,显示合适的信息,标识用户是否已经注册该晚宴或者没有:
    <% if (Request.IsAuthenticated)
       { %>
    <% if (Model.IsUserRegistered(Context.User.Identity.Name))
       { %>
    <p>
        你已经注册了该晚宴!</p>
    <% }
       else
       { %>
    <p>
        你还没有注册该晚宴!</p>
    <% } %>
    <% }
       else
       { %>
    现在<a href="/Account/Logon">登录</a>,注册该晚宴。
    <% } %>
 
现在当用户访问一个已注册的Dinner时,将看到如下信息:
 
 
当访问一个未注册的Dinner时,将看到如下信息:
 
 
实现Register Action方法
下面实现功能,让用户可以在详细页面登记宴会。为了实现这一功能,我们创建一个新的RSVPController类。
在RSVPController类中实现Register action方法,传入Dinner的id作为参数,查找相应的Dinner对象,检查登录的用户是否注册了该晚宴,如果没有,则添加RSVP对象到数据库中:
    public class RSVPController : Controller
    {
        DinnerRepository dinnerRepository = new DinnerRepository();
 
        //
        // AJAX: /Dinners/RSVPForEvent/1
        [Authorize, AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Register(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
 
            if (!dinner.IsUserRegistered(User.Identity.Name))
            {
                RSVP rsvp = new RSVP();
                rsvp.AttendeeName = User.Identity.Name;
                dinner.RSVPs.Add(rsvp);
                dinnerRepository.Save();
            }
            return Content("谢谢- 到时候见!");
        }
    }
 
上述代码返回一个简单的字符串作为action方法的输出,我们也可以将这一消息写在视图模板中。但是既然是一条简单的字符串,我们就是要Controller基类的Content() 辅助方法,返回一条字符串。
 
使用AJAX调用Register Action方法
我们将使用AJAX,在详细页面视图中调用Register action方法,相当容易实现。首先,我们添加2个脚本库的引用:
    <script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
 
第一个库引用核心的ASP.NET AJAX 客户端脚本库,这个文件大概24k(压缩之后),包含核心的客户端AJAX功能。第二个库包含有工具函数,与ASP.NET MVC内置的AJAX辅助方法集成。
 
接着,我们更新之前创建的视图模板代码。不要仅仅输出“你还没有注册该晚宴!”,而是产生一个链接。当点击这一链接时,执行AJAX调用,并调用RSVPController中的Register action方法:
    <div id="rsvpmsg">
    <% if (Request.IsAuthenticated)
       { %>
    <% if (Model.IsUserRegistered(Context.User.Identity.Name))
       { %>
    <p>
        你已经注册了该晚宴!</p>
    <% }
       else
       { %>
    <%= Ajax.ActionLink( "注册该晚宴", "Register", "RSVP", new { id=Model.DinnerID }, new AjaxOptions { UpdateTargetId="rsvpmsg" }) %>
    <% } %>
    <% }
       else
       { %>
    现在<a href="/Account/Logon">登录</a>,注册该晚宴。
    <% } %>
    </div>
 
上述代码使用的Ajax.ActionLink() 辅助方法是ASP.NET MVC内置的,与Html.ActionLink() 辅助方法类似,但不是执行一个标准的导航,而是进行AJAX调用一个action方法。上面,我们调用了RSVPController的Register action方法,并传入Model.DinnerID作为id参数。最后的AjaxOptions 参数表示接收action方法返回的内容,并更新页面中id为 rsvpmsg 的<div>元素。
 
现在当用户访问一个没有注册的Dinner记录时,将看到“注册该晚宴”的链接:
 
 
当用户点击“注册该晚宴”链接,将AJAX调用RSVP Controller的Register action方法,在完成方法调用后,将看到更新的消息如下:
 
 
上述AJAX调用触发的网络带宽和通信量是非常轻量级的。

抱歉!评论已关闭.