автоматическое закрытие пользовательского помощника - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь реализовать автоматическое закрытие пользовательского помощника. Я нашел, как это сделать ниже:
Настраиваемые помощники html: создание помощника с поддержкой операторов using "100"

Я сделал все, кроме: что я должен вернуться сюда?

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 Ответ

2 голосов
/ 05 апреля 2011

Ваш BeginField не должен возвращать Action.

Действие - это делегат, обратный вызов, который необходимо передать конструктору DisposableHelper.Вы установите его как () -> htmlHelper.BeginField(formName).DisposableHelper работает с запоминанием двух обратных вызовов, которые вы передаете - сначала для запуска тега (BeginField), который вызывается немедленно, а затем для завершения тега (EndField), который вызывается при утилизации DisposableHelper.

ОБНОВЛЕНИЕ : это то, как вы должны это реализовать.

a) Скопировать класс DisposableHelper.

b) Написать расширение DisposableExtensions:

public static class DisposableExtensions
{
    public static IDisposable DisposableField(this HtmlHelper htmlHelper, string formName)
    {
        return new DisposableHelper(
            () => htmlHelper.BeginField(formName),
            () => htmlHelper.EndField()
        );
    }
}

c) Измените объявление BeginField, чтобы оно вернуло void:

public static void BeginField(...)

d) Добавьте метод EndField, чтобы закрыть тег.

д) Используйте это так:

using (Html.DisposableField("MyForm"))
{
    ...
}
...