显示用户是否已经回复了
用户访问/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调用触发的网络带宽和通信量是非常轻量级的。