自动关闭自定义助手

时间:2011-04-05 09:06:36

标签: c# asp.net-mvc-2 html-helper

我正在尝试实现自动关闭自定义帮助程序。 我在下面找到了如何做到这一点:
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();
        }
    }

1 个答案:

答案 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