ASP.NET MVC3 HtmlHelper扩展方法(如BeginForm)使用局部视图? [英] ASP.NET MVC3 HtmlHelper extension method like BeginForm that uses a partial view?

查看:147
本文介绍了ASP.NET MVC3 HtmlHelper扩展方法(如BeginForm)使用局部视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我基于此问题的答案创建了扩展方法 .com/questions/8292497/how-can-i-create-a-html-helper-like-html-beginform> c#-如何创建类似Html.BeginForm的HTML Helper-堆栈溢出效果很好.

I created an extension method based on this answer to the SO question c# - How can I create a Html Helper like Html.BeginForm - Stack Overflow and it works fine.

我可以将扩展方法中的嵌入式HTML移到局部视图中,并在保留其当前行为的同时在方法中使用该局部视图吗?特别是,我希望能够包装"任意HTML块.

Can I move the embedded HTML in the extension method into a partial view and use that partial view in the method while preserving it's current behavior? In particular, I want to be able to 'wrap' a block of arbitrary HTML.

我并不是出于任何紧迫的需求,而是出于保持HTML一致的愿望,例如作为视图和局部视图.我想如果同时在视图或局部视图中发现HTML的任何问题,也将容易得多.

I ask not out of any pressing need, but simply out of a desire to maintain HTML consistently, e.g. as views and partial views. I imagine it will be a lot easier to spot any problems with the HTML if it's in a view or partial view too.

这是HtmlHelper扩展方法:

public static IDisposable HelpTextMessage(this HtmlHelper helper, bool isHidden, string heading)
{
    TextWriter writer = helper.ViewContext.Writer;

    writer.WriteLine(
        String.Format(
            "<div class=\"help-text {0}\">",
            isHidden ? "help-text-hidden" : ""));

    writer.WriteLine(
        String.Format(
            "<div class=\"help-text-heading\">{0}</div>",
            heading));

    writer.Write("<div class=\"help-text-body\">");

    return new HelpTextMessageContainer(writer);
}

这是HelpTextMessageContainer类:

private class HelpTextMessageContainer : IDisposable
{
    private readonly TextWriter _writer;

    public HelpTextMessageContainer(TextWriter writer)
    {
        _writer = writer;
    }

    public void Dispose()
    {
        _writer.Write("</div></div>");
    }
}

在视图中,我可以使用如下扩展方法:

In a view, I can use the extension method like this:

@using(Html.HelpTextMessage(Model.HelpText.IsHelpTextHidden(Model.SomeHelpMessage), "Something"))
{
    @:To do something, first do something-more-specific, then do another-something-more-specific.
}

或者我也可以像这样使用它:

Or I could use it like this too:

@using(Html.HelpTextMessage(Model.HelpText.IsHelpTextHidden(Model.SomeHelpMessage), "Something"))
{
    <p>To do something, first do something-more-specific, then do another-something-more-specific.</p>
    <p>Also, keep in mind that you might need to do something-else-entirely if blah-blah-blah.</p>
}

推荐答案

我还没有找到将嵌入的HTML"准确地移到部分视图中的任何方法,但是将HTML封装为一个更友好的方法提供HTML和Razor语法突出显示和Intellisense的方法是按照.

I haven't found any way to move the "embedded HTML" into a partial view exactly, but a slightly more-friendly way to encapsulate the HTML in a way that provides HTML and Razor syntax highlighting and Intellisense is to move into a view helper function in a file under the app App_Code folder as described in this post on "Hugo Bonacci's Blog".

这是我的助手功能:

@helper HelpTextMessage(bool isHidden, string heading, Func<object, object> content)
{
    <div class="help-text @(isHidden ? "help-text-hidden" : "")">
        <div class="help-text-heading">
            @heading
        </div>
        <div class="help-text-body">
            @content(null)
        </div>
    </div>
}

假设上述帮助器函数位于 App_Code 文件夹中名为 ViewHelpers.cshtml 的文件中,则可以在如下视图中调用它:

Assuming the above helper function is in a file named ViewHelpers.cshtml in the App_Code folder, it can be called in a view like this:

@ViewHelpers.HelpTextMessage(false, "Something",
    @:To do something, first do something-more-specific, then do another-something-more-specific.
)

或者这个:

@ViewHelpers.HelpTextMessage(false, "Something",
    <p>To do something, first do something-more-specific, then do another-something-more-specific.</p>
    <p>Also, keep in mind that you might need to do something-else-entirely if blah-blah-blah.</p>
)

与使用@using(Html.HelpTextMessage(...){ ... }语法相比,我更喜欢在视图中具有嵌入式HTML,因此我对此感到非常满意.

I like having the embedded HTML in a view more than I do being able to use the @using(Html.HelpTextMessage(...){ ... } syntax, so I'm pretty happy with this as a solution.

这篇关于ASP.NET MVC3 HtmlHelper扩展方法(如BeginForm)使用局部视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆