我正在尝试实现自动关闭自定义帮助程序。
我在下面找到了如何做到这一点:
Custom html helpers: Create helper with "using" statement support
我做了一切,除了:
我是什么意思回到这里?
public static Action BeginField(this HtmlHelper htmlHelper, string formName)
{
string result = string.Format("<div class=\"FullWidthForm\"><span>{0}</span>", formName);
result += "<ul class=\"Left\">";
htmlHelper.ViewContext.HttpContext.Response.Write(result);
return ???????
}
我在问,因为我有如下错误:
错误9'FieldContainer.BeginField(System.Web.Mvc.HtmlHelper, string)':并非所有代码路径都返回一个 值
所以我不知道该返回什么
好的,我创造了一切:
public static class DisposableExtensions
{
public static IDisposable DisposableField(this HtmlHelper htmlHelper, string formName)
{
//'HtmlHelpers.DisposableHelper' does not contain a constructor that takes 2 arguments
return new DisposableHelper(
() => htmlHelper.BeginField(formName),
() => htmlHelper.EndField());
}
public static void BeginField(this HtmlHelper htmlHelper, string formName)
{
htmlHelper.ViewContext.HttpContext.Response.Write("<ul><li>" + formName + "</li>");
}
public static void EndField(this HtmlHelper htmlHelper)
{
htmlHelper.ViewContext.HttpContext.Response.Write("</ul>");
}
}
class DisposableHelper : IDisposable
{
private Action end;
// When the object is create, write "begin" function
// make this public so it can be accessible
public DisposableHelper(Action begin, Action end)
{
this.end = end;
begin();
}
// When the object is disposed (end of using block), write "end" function
public void Dispose()
{
end();
}
}
答案 0 :(得分:2)
您的BeginField
无需返回Action
。
Action是一个委托,是一个需要传递给DisposableHelper
构造函数的回调。您将其设置为() -> htmlHelper.BeginField(formName)
。 DisposableHelper通过记住您传入的两个回调来工作 - 首先启动标记(BeginField
),立即调用,第二个结束标记(EndField
),在处理{{1 }}
更新:这是您应该如何实施的。
a)复制DisposableHelper
班。
b)写一个DisposableHelper
的扩展名:
DisposableExtensions
c)将您的public static class DisposableExtensions
{
public static IDisposable DisposableField(this HtmlHelper htmlHelper, string formName)
{
return new DisposableHelper(
() => htmlHelper.BeginField(formName),
() => htmlHelper.EndField()
);
}
}
声明更改为返回BeginField
:
void
d)添加public static void BeginField(...)
方法以关闭标记。
e)以这种方式使用它:
EndField