2011-11-16 1 views
5

Sto provando a rendere il seguente codice HTML utilizzando un MVC3 Razor Vista:Come eseguire il rendering di HtmlAttributes con i valori dell'oggetto utilizzando il Razor di ASP.NET MVC 3?

<input id="EffectiveDate" name="EffectiveDate" type="date" data-options='{"mode": "flipbox"}' /> 

sono stato in grado di ottenere le virgolette nelle opzioni-dati degli attributi per il rendering. Non importa quello che provo, sono resi come &quot;

Qui ci sono un paio di molti approcci che ho provato nel mio Vista:

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= " { 'mode':'flipbox' }"}) 

e

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= @Html.Raw("{\"mode\":\"flipbox\"}")}) 

Qualche suggerimento su come decodificare le virgolette?

+0

Cosa stai facendo con quel campo? Se stai usando jquery, potresti doverlo leggere come una stringa html e decodificarlo in jquery, prima di usarlo. – jzm

+0

Sto utilizzando un plugin jQuery Mobile per trasformare la casella di testo in un raccoglitore di date. L'attributo 'data-options' definisce le opzioni del selettore di date. jQuery decodifica l'oggetto opzioni dati come stai dicendo, quindi tutto funziona correttamente. Ma mi piacerebbe sapere come decodificare le virgolette prima del rendering, sia per ripulire il mio codice che per riferimento futuro. Sembra qualcosa che potrei incontrare di nuovo ad un certo punto. – xcer

risposta

4

si può fare questo con la creazione di un modello MVC Editor. Innanzitutto, crea una cartella denominata "EditorTemplates" all'interno della cartella "Views \ Shared". Quindi inserisci un file chiamato DateTime.cshtml all'interno della cartella EditorTemplates.

allora si può semplicemente utilizzare il metodo EditorFor() contro la proprietà il vostro punto di vista di modello come questo (a condizione che la proprietà EffectiveDate di di tipo DateTime):

@Html.EditorFor(m => m.EffectiveDate) 

Il codice completo per il modello editor di DateTime.cshtml assomiglia a questo:

@model System.DateTime 
@{ 
    var id = this.ViewData.TemplateInfo.GetFullHtmlFieldId(""); 
    var name = this.ViewData.TemplateInfo.GetFullHtmlFieldName(""); 
} 
<input id="@id" name="@name" type="date" data-options='{"mode": "flipbox"}' /> 

Ciò produrrà l'output esatto che si sta cercando.

+0

Sto già utilizzando un modello di editor per questo campo (per ragioni estranee a questo problema), quindi questo approccio funzionerà bene per me. Grazie! E grazie a @rdumont per aver spiegato perché le estensioni di input MVC codificano sempre gli attributi. – xcer

1

Una cosa è certa: i simboli speciali verranno sempre codificati quando si utilizzano le estensioni di input MVC predefinite (ad esempio TextBoxFor). Questo perché TagBuilder stesso, che viene utilizzato per creare i tag per le estensioni HtmlHelper, HtmlEncode s ogni valore di attributo in un tag. Si può vedere questo nella fonte TagBuilder:

private void AppendAttributes(StringBuilder sb) 
{ 
    foreach (var attribute in Attributes) 
    { 
     string key = attribute.Key; 
     if (String.Equals(key, "id", StringComparison.Ordinal /* case-sensitive */) && String.IsNullOrEmpty(attribute.Value)) 
     { 
      continue; // DevDiv Bugs #227595: don't output empty IDs 
     } 
     string value = HttpUtility.HtmlAttributeEncode(attribute.Value); 
     sb.Append(' ') 
      .Append(key) 
      .Append("=\"") 
      .Append(value) 
      .Append('"'); 
    } 
} 

Dal momento che non si ha modo di inviare quel valore già decodificato, si deve decodificare da soli in JavaScript. Ecco un bel trucco jQuery che lo farà:

var value = $('<textarea/>').html(yourElement.data('options')).val(); 

Si potrebbe voler fare una funzione per questo, naturalmente.

Fonti: