asp.net-mvc-3 – 在BeginForm样式的一次性html帮助器中捕获包装内容

我正在尝试编写一个BeginForm样式的html帮助器,它使用IDisposable来包装其他代码.我希望帮助器只在满足某个条件时呈现包装的代码(例如,用户处于某个角色).

我以为我可以简单地在Begin方法中切换context.Writer并在Dispose方法中将其切换回来.下面的代码编译并运行,但包装的内容在所有情况下都会呈现.如果我单步执行它,包装的内容不会写入新的StringWriter,因此不在我的控制范围内.

    public static IDisposable BeginSecure(this HtmlHelper html, ...)
    {
        return new SecureSection(html.ViewContext, ...);
    }

    private class SecureSection : IDisposable
    {
        private readonly ViewContext _context;
        private readonly TextWriter _writer;

        public SecureSection(ViewContext context, ...)
        {
            _context = context;
            _writer = context.Writer;
            context.Writer = new StringWriter();
        }

        public void Dispose()
        {
            if (condition here)
            {
                _writer.Write(_context.Writer);
            }

            _context.Writer = _writer;
        }
    }

我正在尝试用html帮助器做什么?

我知道razor中的声明性html助手可能会工作,但如果可能的话,我会更喜欢标准的html助手方法,因为MVC3中的razor助手的app_code限制.

您无法有条件地呈现返回IDisposable的辅助方法的正文内容.它将始终呈现.当你想用一些自定义标记包装using块的主体时,你可以使用这种类型的帮助器,例如BeginForm帮助器和< form>元件.

您可以使用templated Razor delegate代替:

public static class HtmlExtensions
{
    public static HelperResult Secure(this HtmlHelper html, Func<object, HelperResult> template)
    {
        return new HelperResult(writer =>
        {
            if (condition here)
            {
                template(null).WriteTo(writer);
            }
        });
    }
}

然后:

@Html.Secure(
    @<div>
         You will see this text only if some condition is met
    </div>
)
翻译自:https://stackoverflow.com/questions/10013095/capture-wrapped-content-in-beginform-style-disposable-html-helper

转载注明原文:asp.net-mvc-3 – 在BeginForm样式的一次性html帮助器中捕获包装内容