Domanda

Se ho un Visualizza modello come questo:

public class MyViewModel
{
   [UIHint("SomeTemplate")]
   public ICollection<SomeViewModel> Submodel { get; set; }
}

E un tipo fortemente tipizzato Visualizzazione con una riga di HTML come questa:

@Html.DisplayFor(model => model.Submodel)

E un modello di visualizzazione con una firma così:

@model MvcApplication1.Models.SomeViewModel

Ricevo un errore che dice "l'elemento del modello è di tipo List<SomeViewModel> ma questo dizionario richiede un modello di tipo SomeViewModel.".

Il che ha senso, ma avrei sperato che l'intelligenza dei modelli incorporata di MVC entrasse in azione, vedi che è un IEnumerable di qualcosa e prova a chiamare il mio modello N un numero di volte, come fa di solito Html.DisplayFor senza il suggerimento.

Quindi sembra [UIHint] sovrascrive tale funzionalità?

Ovviamente posso indicare un altro modello che accetta la raccolta e chiama Html.DisplayForModel(), fondamentalmente emulando l'intelligenza di MVC.Ma spero di evitarlo.Onestamente preferirei fare un ciclo foreach piuttosto che avere quel modello "wrapper" da 1 riga.

Qualche idea migliore?

È come se volessi dire:"Ehi MVC, renderizza un modello per ognuno di questi ragazzi.Ma invece di usare la convenzione dei nomi per trovare il modello, ecco un suggerimento".

È stato utile?

Soluzione

UIHint significa "Renderizza questo modello utilizzando il modello denominato XXX".Quindi devi dichiarare il tuo displaytemplate "SomeTemplate" con

@model MvcApplication1.Models.ICollection<SomeViewModel>

E mostra ogni elemento all'interno di un foreach.

Altri suggerimenti

Un'alternativa è passare il nome del modello di stringa come segue

@Html.DisplayFor(model => model.Submodel, "SomeTemplate")

Ho riscontrato lo stesso problema.Sembra che UIHint venga ignorato per impostazione predefinita per i tipi complessi.È possibile ignorare il comportamento ma non è semplice.Quindi la soluzione più semplice sarebbe:

1) Rimuovere l'annotazione UIHint.2) Assicurati invece che il file del modello di visualizzazione sia denominato come il nome del tipo su cui desideri che Html.DisplayFor esegua automaticamente l'iterazione.Pertanto, nel tuo caso, denomina il file del modello di visualizzazione come SomeViewModel.cshtml.Questo dovrebbe funzionare.Non è necessario utilizzare esplicitamente il ciclo for.L'ho provato in MVC4 e funziona.

Ho trovato la soluzione dal seguente link:http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of-knockout-js/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top