一下其使用方法:
[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 |