g语句之间插入代码。这使它的能力无疑比那些仅仅返回一个字符 串注入页面的方式要强大许多。
所以,我选择第二种方法来实现我的View Helpers.所以HtmlHelper扩展方法会集成IViewObject接口 并返回我创建的对象。类图如下:
可以看到,IViewObject实现了System.IDisposable接口。这使实现如前面所提到和Html.BeginForm的 使用方法类似所必须的。IViewObject有两个方法,StartView和EndView.这两个方法分别在对象创建时和 对象回收时被调用.为了让这些对象的创建更加容易我创建了一个抽象类来处理:执行方法,回收对象和在 合适的时候调用EndView方法。类图如下:
上图中的抽象类完整代码如下:
public abstract class AbstractHtmlViewObject : IViewObject
{
private bool mDisposed;
public AbstractHtmlViewObject(ViewRequestContext requestContext, string name)
{
if (requestContext == null)
{ throw new ArgumentNullException("requestContext"); }
ViewRequestContext = requestContext;
Name = name;
}
public IViewRequestContext RequestContext
{
get;
protected set;
}
#region IViewObject Members
public object Attributes { get; set; }
public string Name { get; set; }
public abstract void StartView();
public abstract void EndView();
#endregion
// based on System.Web.Mvc.HtmlHelper.GetModelStateValue
public object GetModelStateValue(string key, Type destinationType)
{
object result = null;
ModelState modelState;
if (ViewRequestContext.HtmlHelper.ViewData.ModelState.TryGetValue(
key, out modelState))
{
result = modelState.Value.ConvertTo(destinationType, null);
}
return result;
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!mDisposed)
{
mDisposed = true;
EndView();
}
}
#endregion
}
如你所见上面AbstractHtmlViewObject对象不仅满足了最上面提到的列表(Ricky那段里),还包含了 一些辅助类更容易扩展的东西。也就是它包含的一个属性:RequestContext,这个属性可以帮助我们很容 易创建HTML和扩展方法GetModelStateValue,我们会在后面详细讲述GetModelStateValue的使用方法。我 们会在后面讲述RequestContext的细节,这里我们先看看如何创建我们先前讨论的那个textbox。
原文链接:http://mvcviewhelpers.codeplex.com/ |