2009-11-12 19 views
5

Stiamo cercando di essere sicuri per i caratteri nelle nostre visualizzazioni e utilizzare i nuovi HtmlHelpers di ExpressionInputExtenssion, ma stiamo riscontrando risultati incoerenti. Abbiamo una visione che assomiglia a questo:ASP.Net MVC 2.0 Html.HiddenFor L'estensione HtmlHelper non restituisce il valore

ViewData.Model.FooID = <%= ViewData.Model.FooID %>< 
Model.FooID = <%= Model.FooID %>  
<%= Html.HiddenFor(x=>x.FooID) %> 

Ma ciò che vediamo nella visualizzazione reso è questo:

ViewData.Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338 
Model.FooID = 515b0403-e75b-4bd7-9b60-ef432f39d338  
<input id="FooID" name="FooID" type="hidden" value="" /> 

posso aggiungere manualmente questo:

<input id="FooID" name="FooID" type="hidden" value="<%= Model.FooID %>" /> 

Ma ora noi non lo sono più, ma sorprendentemente quando lo faccio, Html.HiddenFor ha sempre il valore corretto.

risposta

2

Sembra che il raccoglitore modello dietro al metodo di estensione non possa convertire il tipo di dati FoodID in una stringa. Il tuo tipo di dati è un GUID regolare?

ho conosciuti ci sono sovraccarichi di questo metodo di estensione per lavorare con i binari, ma non sono sicuro di GUID ....

u hanno provato debbuging esso?

+0

In realtà è un Nullable ? No, non ho ancora eseguito il debug dell'estensione HtmlHelper. Il legatore modello dovrebbe legare il modello prima che l'azione del controller sia corretta? Posso intervenire sull'azione del mio controller, vedermi modellare con il valore corretto e anche nella vista posso vedere il modello con il valore corretto. Posso persino vedere il valore del modello valutare nella vista se accedo direttamente alla proprietà. – Mark

+0

Ho appena provato questo e funziona bene: <% = Html.Hidden ("CustomerGuid", item.CustomerGuid)%> Almeno in questo modo si può ancora essere sicuro dal tipo ... –

+0

Sì. Potrei farlo, ma stavo cercando di evitare il nome del controllo "CustomerGuid". Sarebbe bello se ti dessero solo un metodo di estensione come Html.IdFor (x => x.CustomerGuid) e poi potrei lanciarlo ovunque mi serva. Non mi interessa scrivere l'HTML, basta nominare il controllo. Grazie! – Mark

1

Ho riscontrato un problema simile, ho un elemento del modello nascostoinput, posso vedere il valore corretto di questo elemento mentre visualizza la vista (come debug lo mostro per verificare che ci sia il valore corretto nella vista), ma una volta I postare la vista, il valore di ritorno di questo elemento rimane la prima volta che è stato impostato, qualunque cosa aggiorni il display e si assicuri il valore corretto mostrato nella vista, ma il valore restituito mantiene semplicemente il valore impostato alla prima volta. Questo è strano

1

È inoltre possibile ruotare la propria estensione che utilizzano il valore dalla proprietà

@Html.HiddenForField(m => m.Location.CityRequired) 

public static class HiddenExtensions 
{ 
    public static MvcHtmlString HiddenForField<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression) where TModel : class 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     var value = metadata.Model; 
     return htmlHelper.HiddenForField(expression, value); 
    } 

    public static MvcHtmlString HiddenForField<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object value) where TModel : class 
    { 
     string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName); 
     var tag = new TagBuilder("input"); 
     tag.GenerateId(fullName); 
     tag.Attributes.Add("type", "hidden"); 
     tag.Attributes.Add("name", fullName); 
     tag.Attributes.Add("value", value != null ? value.ToString() : string.Empty); 
     return new MvcHtmlString(tag.ToString()); 
    } 
} 
Problemi correlati