2013-03-06 5 views
19

này được mã của tôi:ASP MVC Razor mã hóa ký tự đặc biệt trong placeholder đầu vào

mẫu:

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

Xem:

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

Nó sẽ được trả lại như thế này:

Công ty của bạn & # 39; s name

sản lượng 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=""> 

Nó phải giống như thế này: Tên

của công ty bạn

Tại sao văn bản không làm đúng và làm thế nào tôi có thể ngăn chặn điều này?

Tôi đã cố gắng này:

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

và điều này

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

'trình giữ chỗ' của bạn được mã hóa là:' Tên công ty của bạn là '# 39; –

+0

Có, chính xác như mô tả ở trên. – Sebastian

Trả lời

36

Tôi nghĩ rằng bài này sẽ giúp bạn:

HTML encode decode c# MVC4

Tôi nghĩ rằng có nhiều cách khác để có được hành vi này, nhưng đây là một tùy chọn sử dụng TextBox:

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

Ngoài ra còn có HttpUtility.HtmlDecode, điều này có thể hữu ích với hành động lưu của chúng tôi.

cập nhật

nếu bạn quấn HttpUtility.HtmlDecode xung quanh giữ chỗ của bạn:

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

lợi nhuận giữ chỗ như: placeholder = "Công ty ' tên của bạn"

+0

Liên kết bạn đăng không có tác dụng. Tôi đã thử '@ Html.Raw'. Đối với thuộc tính trình giữ chỗ, nó không hoạt động. – Sebastian

+1

Bạn có muốn mã hóa đối tượng để trở thành 'trong hộp văn bản không? –

+0

Đúng vậy. Tôi đã cập nhật câu hỏi của mình. – Sebastian

3

Dưới đây là một displayplaceholderfor helper sẽ hiển thị trình giữ chỗ mà không cần mã hóa.

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

- EDIT -

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

Trong khi liên kết này có thể trả lời câu hỏi , tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – tsnorri

1

Nó sẽ không thể dễ dàng hơn để sử dụng chỉ cần bỏ Html.DisplayNameFor? Giải mã và mã hóa lại văn bản có vẻ không cần thiết.

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); 
}