一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 23
本文根据《Professional ASP.NET MVC 1.0》中微软牛人Scott Guthrie 提供免费下载的第一章,一步一步演示如何通过ASP.NET MVC 1.0 正式版创建NerdDinner 范例程序。对了解如何使用最新的ASP.NET MVC 1.0框架创建Web Application 非常有帮助。本文由
http://forum.entlib.com 开源论坛小组提供。
本文继续学习之旅,一步一步通过ASP.NET MVC 1.0 实现NerdDinner 范例程序。
在编辑Dinners记录时,使用User.Identity.Name 属性
下面针对编辑Dinners的功能进行授权,限制仅仅Dinner的主持人能够编辑Dinner的属性。
为了实现这一功能,我们首先在Dinner 对象(先前我们创建的Dinner.cs Partial 类)添加一个IsHostedBy(username)的辅助方法。该方法根据传入的用户名是否匹配Dinner的HostedBy属性,来返回true或false,并封装了大小写无关的字符串比较:
public partial class Dinner {
public bool IsHostedBy(string userName) {
return HostedBy.Equals(userName, StringComparison.InvariantCultureIgnoreCase);
}
}
我们接着在DinnersController类中的Edit() Action方法上添加[Authorize] 属性,确保访问/Dinners/Edit/[id] URL的用户必须已经登录。
在Edit方法中,使用Dinner.IsHostedBy(username) 辅助方法验证登录的用户是否匹配Dinner的主持人。如果用户不是host,则显示InvalidOwner视图,并终止请求,代码如下:
//
// GET: /Dinners/Edit/2
public ActionResult Edit(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name))
return View("InvalidOwner");
// 使用ViewData
// ViewData["Countries"] = new SelectList(PhoneValidator.Countries, dinner.Country);
// return View(dinner);
// 使用ViewModel
return View(new DinnerFormViewModel(dinner));
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name))
return View("InvalidOwner");
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
// 使用ViewData
// ViewData["countries"] = new SelectList(PhoneValidator.Countries, dinner.Country);
// return View(dinner);
// 使用ViewModel
return View(new DinnerFormViewModel(dinner));
}
}
参考之前的步骤,创建一个新的InvalidOwner视图模板,并添加如下错误信息的显示:
<asp:Content ID="Title" ContentPlaceHolderID="TitleContent" runat="server">
You don't own this dinner.
</asp:Content>
<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
<h2>未授权访问该记录!</h2>
<p>对不起,仅Dinner的主人可以编辑或删除该记录。</p>
</asp:Content>
现在当一个未授权的用户视图编辑一条Dinner记录时,将显示如下错误信息页面:
重复上述步骤,也对DinnersController中的Delete() action方法进行授权控制,确保仅Dinner的主人才允许删除该记录。
显示/隐藏编辑和删除链接
下图Dinner的详细信息页面,显示了编辑和删除Dinner记录的链接,该链接分别指向DinnersController类的Edit和Delete action方法:
目前,不管当前访问者是否是该Dinner的主人,编辑和删除的链接都会显示。下面,我们将改变这一情况,仅仅当访问者是Dinner的owner时,才显示上述链接。
DinnersController中的Details() action方法查询一个Dinner对象,接着作为Model对象传递给视图模板,代码如下:
//
// GET: /Dinners/Details/2
public ActionResult Details(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
if (dinner == null)
return View("NotFound");
else
return View("Details", dinner);
}
下面将更新视图模板,利用Dinner.IsHostedBy() 辅助方法来协助显示/隐藏编辑和删除链接,代码如下:
<% if (Model.IsHostedBy(Context.User.Identity.Name)) { %>
<%= Html.ActionLink("Edit Dinner", "Edit", new { id=Model.DinnerID })%>
|
<%= Html.ActionLink("Delete Dinner","Delete", new { id=Model.DinnerID})%>
<% } %>