快速业务通道

Asp.net MVC示例项目“Suteki.Shop”分析之ViewData

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
一下其使用方法:

[AcceptVerbs(HttpVerbs.Post), UnitOfWork]
public ActionResult Edit ([DataBind] User user, string password)
{
if(! string.IsNullOrEmpty(password))
{
user.Password = userService.HashPassword(password);
}

try
{
user.Validate();
}
catch (ValidationException validationException)
{
validationException.CopyToModelState(ModelState, "user");
return View("Edit", EditViewData.WithUser(user));
}

return View ("Edit", EditViewData.WithUser(user).WithMessage("Changes have been saved"));
}

注意其中的EditViewData属性就是初始化一个ShopViewData实 例并调用该实例的WithRoles()方法来完成对用户规则的获取。然后在"Edit"这个Action的 返回语句中继续绑定其他信息,如当前编辑的用户信息“user”,以及操作提示信息 “Changes have been saved”。

这样就可以在View中对ShopViewData进行显示操作 了。这里要说明的是在View中对Message的显示是通过下面这一行完成的:

<%= Html.MessageBox(ViewData.Model) %>

而这个方法是对HtmlHelper这个MVC类的扩展 方法,其方法定义如下:

public static string MessageBox(this HtmlHelper htmlHelper, IMessageViewData messageViewData)
{
if (messageViewData.Message == null) return string.Empty;

HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());

writer.AddAttribute("class", "message");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write (messageViewData.Message);
writer.RenderEndTag();
return writer.InnerWriter.ToString();
}

大家看到了其传入的参数是IMessageViewData 类型,而传入的是“ShopViewData”类型,如下图所示:

而看过上面内容的话,就可以通过其类图中实现的方法看出这个继承实现链表:

ShopViewData ==> ViewDataBase == > IMessageViewData

所以扩 展文法直接就完成了这种“向上转型”操作。

除了“编辑用户”这种在 Action中直接绑定Message字段属性的方式,Suteki.Shop还提供了Filter方式的“操作信息 ”绑定,比如CopyMessageFromTempDataToViewData(Suteki.Shop\Filters),其代码如下:

public class CopyMessageFromTempDataToViewData : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var result = filterContext.Result as ViewResult;

if(result != null && filterContext.Controller.TempData.ContainsKey("message"))
{
var model = result.ViewData.Model as ShopViewData;

if(model != null && string.IsNullOrEmpty(model.Message))
{
model.Message = filterContext.Controller.TempData["message"] as string;
}
}
}
}

大家请注意,上面的filterContext.Controller类型是ControllerBase(详 细说明参见我之前写的这篇文章),其提供了Message属性来实现临时数据TempData ["message"]的获取来绑定工作,代码如下:

[Rescue("Default"), Authenticate, CopyMessageFromTempDataToViewData]
public abstract class ControllerBase : Controller, IProvidesBaseService
{


public string Message
{
get { return TempData["message"] as string; }
set { TempData ["message"] = value; }
}
}

这样就可以通过 CopyMessageFromTempDataToViewData这个Filter

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号