接受的答案是非常有幫助的。我爲我的項目進行了一些更新和更新,我覺得這個版本對於那些只想跳槽並完成任務的人來說會更加清晰。
變化包括:
- 升級爲使用匿名類型而不是IDictionary的,因爲這似乎是現在的標準。
- 刪除了Begin/End ...語法,因爲我只會在using()語法中使用它,爲此我覺得這更清晰。
- 爲了清晰起見,調整了命名。
- 新增了一個headerText參數,我的面板使用它創建一個單獨的div標題。如果你不需要/需要,這很容易刪除。
- 重構了幾種方法。
如果您碰巧正在尋找KendoUI的面板幫手 - 好吧,這恰好是這樣的。我有一個名爲Panel的類,它引用了這個類,並且只是爲KendoUI標籤添加了邊距和寬度。
using System; using System.Diagnostics.CodeAnalysis;使用System.IO的 ;使用System.Web的 。MVC;
命名空間MyProject.Web.HtmlHelpers.Extensions { 公共靜態類LayoutExtensions { 公共靜態StyledPanel面板(在此的HtmlHelper的HtmlHelper,對象htmlAttributes = NULL,串HEADERTEXT = NULL){ 返回 GetStyledPanel(的HtmlHelper,HEADERTEXT ,htmlAttributes); }
private static StyledPanel GetStyledPanel(this HtmlHelper htmlHelper, string headerText, object htmlAttributes)
{
if (!string.IsNullOrWhiteSpace(headerText))
RenderHeading(htmlHelper, headerText);
RenderDiv(htmlHelper, htmlAttributes);
return new StyledPanel(htmlHelper.ViewContext.Writer);
}
private static void RenderHeading(HtmlHelper htmlHelper, string headerText)
{
TagBuilder tagBuilder = new TagBuilder("div");
tagBuilder.Attributes.Add("class", "panelHead");
tagBuilder.SetInnerText(headerText);
htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.Normal));
}
private static void RenderDiv(HtmlHelper htmlHelper, object htmlAttributes)
{
TagBuilder Tag = new TagBuilder("div");
Tag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
Tag.MergeAttribute("class", "panel k-block k-shadow");
htmlHelper.ViewContext.Writer.Write(Tag.ToString(TagRenderMode.StartTag));
}
}
public class StyledPanel : IDisposable
{
private bool m_Disposed;
private readonly TextWriter m_Writer;
public StyledPanel(TextWriter writer)
{
if (writer == null)
throw new ArgumentNullException("Writer was null. This should never happen.");
m_Writer = writer;
}
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!m_Disposed)
{
m_Disposed = true;
m_Writer.Write("</div>");
}
}
public void EndForm()
{
Dispose(true);
}
}
}
用法可能是這樣的:
@using (Html.Panel(headerText: "My Header",
htmlAttributes: new { style = "width: 800px;" }))
{
<table>
<tr>
<td class="label">First Name:</td>
<td class="content"><input name="thing" class="k-textbox" /></td>
<td class="label">Last Name:</td>
<td class="content"><input name="thing" class="k-textbox" /></td>
</tr>
</table>
}
或者只是:
@using (Html.Panel())
{
<table>
<tr>
<td class="label">First Name:</td>
<td class="content"><input name="thing" class="k-textbox" /></td>
<td class="label">Last Name:</td>
<td class="content"><input name="thing" class="k-textbox" /></td>
</tr>
</table>
}
我可以問你要實現的目標是什麼? - 你想Html.ContentField()生成一個div嗎? – ebb 2011-04-13 13:09:40
@ebb是的。上面的div。 – rebelliard 2011-04-13 13:14:13