我根据this answer创建了一个针对SO问题c# - How can I create a Html Helper like Html.BeginForm - Stack Overflow的扩展方法,它运行正常。
我可以将扩展方法中的嵌入式HTML移动到局部视图中并在方法中使用该局部视图,同时保留它的当前行为吗?特别是,我希望能够“包装”任意HTML块。
我不是出于任何紧迫的需求,而是出于对维持HTML的渴望,例如作为观点和部分观点。我想如果在视图或部分视图中发现HTML的任何问题会更容易。
以下是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>");
}
}
在视图中,我可以使用这样的扩展方法:
@using(Html.HelpTextMessage(Model.HelpText.IsHelpTextHidden(Model.SomeHelpMessage), "Something"))
{
@:To do something, first do something-more-specific, then do another-something-more-specific.
}
或者我也可以这样使用它:
@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>
}
答案 0 :(得分:1)
我还没有找到任何方法将“嵌入式HTML”精确地转移到局部视图中,但是以一种提供HTML和Razor语法高亮显示和Intellisense的方式封装HTML的方式稍微更加友好。应用 App_Code 文件夹下的文件中的视图助手功能,如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 的文件中,可以在以下视图中调用它:
@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>
)
我喜欢在视图中使用嵌入式HTML而不是使用@using(Html.HelpTextMessage(...){ ... }
语法,所以我很高兴将其作为解决方案。