ASP MVC Razor 在输入占位符中编码特殊字符

Posted

技术标签:

【中文标题】ASP MVC Razor 在输入占位符中编码特殊字符【英文标题】:ASP MVC Razor encode special characters in input placeholder 【发布时间】:2013-02-21 04:34:07 【问题描述】:

这是我的代码:

型号:

[Required]
[DataType(DataType.Text)]
[Display(Name = "Your company's name")]
public string CompanyName  get; set; 

查看:

@html.TextBoxFor(m => m.CompanyName, new  @class = "account-input", @placeholder = @Html.DisplayNameFor(m => m.CompanyName), @id = "companyname" )

会这样渲染:

贵公司的名称

html 输出:

<input class="account-input" data-val="true" data-val-required="The Your company's name field is required." id="companyname" name="CompanyName" placeholder="Your company&amp;#39;s name" type="text" value="">

应该是这样的:

贵公司的名称

为什么文本不能正确呈现,我该如何防止这种情况发生?

我已经试过了:

@Html.TextBoxFor(m => m.CompanyName, new  @class = "account-input", @placeholder = @Html.Raw(@Html.DisplayNameFor(m => m.CompanyName)), @id = "companyname" )

还有这个

@Html.TextBoxFor(m => m.CompanyName, new  @class = "account-input", @placeholder = @Html.Encode(@Html.DisplayNameFor(m => m.CompanyName)), @id = "companyname" )

【问题讨论】:

您的placeholder 编码为:Your Company&amp;amp;#39;s name? 是的,和上面描述的完全一样。 【参考方案1】:

我认为这篇文章会对你有所帮助:

HTML encode decode c# MVC4

我认为还有其他方法可以实现这种行为,但这是使用 TextBox 的一种选择:

@Html.TextBox("CompanyName", HttpUtility.HtmlEncode("Your company&#39;s name"))

还有HttpUtility.HtmlDecode,这可能有助于我们的保存操作。

更新

如果您将 HttpUtility.HtmlDecode 包裹在占位符周围:

@Html.TextBoxFor(m => m.CompanyName, new  @class = "account-input", 
@placeholder = HttpUtility.HtmlDecode(Html.DisplayNameFor(x => x.CompanyName).ToHtmlString()), 
@id = "companyname" )

占位符返回为: placeholder="贵公司名称"

【讨论】:

您发布的链接没有帮助。我已经尝试过@Html.Raw。对于占位符属性,它不起作用。 是否要将实体编码为文本框中的 '? 哦,是的,就是这样。谢谢! 同样可以使用HtmlString【参考方案2】:

这是一个帮助器 displayplaceholderfor,它将显示占位符而不进行编码。

http://www.davidberube.me/displayplaceholderfor-mvc-placeholder-for-special-characters/

-- 编辑--

public static partial class Extensions

   public static MvcHtmlString DisplayPlaceHolderFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
   
      var result = html.DisplayNameFor(expression).ToHtmlString();
      return new MvcHtmlString(System.Web.HttpUtility.HtmlDecode(result.ToString()));
   

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案3】:

跳过使用 Html.DisplayNameFor 不是更容易吗?似乎不需要对文本进行解码和重新编码。

public static MvcHtmlString DisplayPlaceHolderFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)

    var metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var resolvedDisplayName = metaData.DisplayName ?? metaData.PropertyName;

    if (!string.IsNullOrEmpty(resolvedDisplayName))
        return new MvcHtmlString(resolvedDisplayName);

    var htmlFieldName = ExpressionHelper.GetExpressionText(expression);
    resolvedDisplayName = htmlFieldName.Split('.').Last();

    return new MvcHtmlString(resolvedDisplayName);

【讨论】:

以上是关于ASP MVC Razor 在输入占位符中编码特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC5 Font-awesome in placeholder

如何在输入标签的占位符中添加材质图标

显示换行符 asp.net mvc razor

在 UITextField 占位符中输入文本时,应一次消失一个字母

如何在输入的占位符中使用 open-iconic-bootstrap

如何在输入占位符中为主文本和子文本应用不同的样式?