我无法弄清楚如何在Html.LabelFor中使用@class,所以我使用SO上的代码更新了Html.Label的扩展帮助程序。
我的LabelExtension.cs文件包含以下类:
public static class LabelExtensions
{
public static string Label(this HtmlHelper helper,
string labelFor,
string value,
object htmlAttributes)
{
TagBuilder labelBuilder = new TagBuilder("label");
if (!string.IsNullOrEmpty(labelFor))
{
labelBuilder.Attributes.Add("for", labelFor);
}
labelBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
labelBuilder.SetInnerText(value);
return labelBuilder.ToString(TagRenderMode.Normal);
}
}
我最初在MVC2 .aspx页面中使用了以下内容(我将转换为.cshtml):
<% Html.BeginForm(); %> <%= Html.Label("txt_name_udq", "Your First Name (required):",
new {
@class
= "mylabelstyle" } )%>
<br />
<%= Html.TextBox("txt_name_udq", null, new {
@class
= "myinputstyle" } )%>
<br />
<%= Html.Label("txt_email_udq", "Your E-Mail Address (required):", new {
@class
= "mylabelstyle" } )%>
<br />
<%= Html.TextBox("txt_email_udq", null, new {
@class
= "myinputstyle" })%>
<br />
<% Html.EndForm(); %>
这在MVC2中表现得很好(为了简洁,我省略了使用等等)。但是,今天在转换为.cshtml(使用_layout.cshtml)时,我发现Html.Label没有呈现而是输出源。这是代码:
@section QuoteForm
{
<div class="entryfull">
<div class="entryfull_box">
<div class="entryfull_text">
<h2>
Quote Request
</h2>
<ul class="ul-check">
<li>Free</li>
<li>Confidential</li>
<li>Anonymous</li>
<li>No Obligation</li>
</ul>
@using (Html.BeginForm())
{
@Html.Label("txt_name_udq", "Your First Name (required):", new { @class = "mylabelstyle" })
<br />
@Html.TextBox("txt_name_udq", null, new { @class = "myinputstyle" })
<br />
@Html.Label("txt_email_udq", "Your E-Mail Address (required):", new { @class = "mylabelstyle" })
<br />
@Html.TextBox("txt_email_udq", null, new { @class = "myinputstyle" })
<br />
}
</div>
</div>
</div>
}
以上只是简单而非最终产品。我只是想让它首先渲染。注意:1)我尝试了Html.BeginForm的各种迭代; 2)我甚至将它封入其中。不过,它还没有“正常工作”。
以下是您在浏览器上看到的标签(browswer中输出的源),文本框正上方(呈现):
<label class="mylabelstyle" for="txt_name_udq">Your First Name (required):</label>;
如果您“查看来源”,您会看到以下内容:
<label class="mylabelstyle" for="txt_name_udq">Your First Name (required):</label>;
这与@section有关吗?还是我试图使用MVC2的扩展名?
提前感谢任何想法/建议。
编辑:这是我在评论中引用的代码,适用于我的情况。谢谢你的帮助。
public static MvcHtmlString Label(this HtmlHelper htmlHelper, string labelFor, string value,
object htmlAttributes)
{
var tagBuilder = new TagBuilder("label");
tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
tagBuilder.MergeAttribute("for", labelFor.Replace(".", tagBuilder.IdAttributeDotReplacement), true);
tagBuilder.SetInnerText(value);
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
答案 0 :(得分:4)
这是因为你的帮助器返回一个字符串,默认情况下编码。你的助手应该返回MvcHtmlString并将return语句改为
return new MvcHtmlString(labelBuilder.ToString(TagRenderMode.Normal));