一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 23


一步一步学习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})%>
    <% } %>
 
今天就到这里了,明天继续,欢迎交流 – http://forum.EntLib.com 开源论坛小组。
 

 

发表 @ 2009年4月10日 22:16

打 印

评论

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 23

Left by Join.Qi at 2009/6/4 21:16
Gravatar
沙发了

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 23

Left by kimi at 2009/9/14 23:20
Gravatar
看到第23章,我已经头晕目眩了。使用了[Authorize]以后 再添加add view的时候VS总是卡死不动,都死了4次了,郁闷

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 23

Left by dbens at 2010/2/9 15:42
Gravatar
在Create方法里参数可以为(Dinner dinner) 为何Edit方法里不可以呢?

您的评论:



 (不显示)


 
 
 
Please add 3 and 3 and type the answer here:
    
 

评论预览窗口:

 
«九月»
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789