2013-03-06 4 views
19

Questo è il mio codice:ASP MVC Razor codificare i caratteri speciali nel segnaposto di input

Modello:

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

Vista:

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

Si sarà reso in questo modo:

La tua azienda & # 39; s nome

output 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=""> 

dovrebbe essere simile a questa: nome

della vostra azienda

Perché il testo non rende correttamente e come posso prevenire questo?

ho già provato questo:

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

e questo

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

il tuo 'segnaposto' codifica come:' La tua azienda & # 39; s nome'? –

+0

Sì, esattamente come descritto sopra. – Sebastian

risposta

36

Penso che questo post vi aiuterà a:

HTML encode decode c# MVC4

penso che ci sono altri modi per ottenere questo comportamento, ma questa è un'opzione di utilizzo del TextBox:

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

C'è anche HttpUtility.HtmlDecode, che potrebbe aiutare con la nostra azione di salvataggio.

aggiornamento

se si avvolge HttpUtility.HtmlDecode intorno al vostro posto titolare:

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

i rendimenti segnaposto come: placeholder = "La vostra azienda ' s nome"

+0

Il link che pubblicate non aiuta. Ho già provato '@ Html.Raw'. Per la proprietà segnaposto non funziona. – Sebastian

+1

Vuoi codificare l'entità per diventare "nella casella di testo? –

+0

Esatto. Ho aggiornato la mia domanda. – Sebastian

3

Ecco un displayplaceholderfor aiutante che presenterà segnaposto senza codifica.

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

Sebbene questo collegamento possa rispondere alla domanda , è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – tsnorri

1

Non sarebbe più facile saltare usando solo Html.DisplayNameFor? La decodifica e la ricodifica del testo non sono necessarie.

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