Sto cercando di ottenere UpdateModel per popolare un modello impostato come solo un'interfaccia in fase di compilazione. Ad esempio, ho:ASP.NET MVC UpdateModel con interfaccia
// View Model
public class AccountViewModel {
public string Email { get; set; }
public IProfile Profile { get; set; }
}
// Interface
public interface IProfile {
// Empty
}
// Actual profile instance used
public class StandardProfile : IProfile {
public string FavoriteFood { get; set; }
public string FavoriteMusic { get; set; }
}
// Controller action
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is populated already
UpdateModel(viewModel.Profile, "Profile"); // This isn't working.
}
// Form
<form ... >
<input name='Email' />
<input name='Profile.FavoriteFood' />
<input name='Profile.FavoriteMusic' />
<button type='submit'></button>
</form>
noti inoltre che ho un legante modello personalizzato che eredita da DefaultModelBinder utilizzato che popola iProfile con un'istanza StandardProfile nel metodo CreateModel overriding.
Il problema è che FavoriteFood e FavoriteMusic non vengono mai popolati. Qualche idea? Idealmente, questo dovrebbe essere fatto nel modello di legatura, ma non sono sicuro che sia possibile senza scrivere un'implementazione completamente personalizzata.
Grazie, Brian
L'interfaccia vuota consente di riutilizzare lo stesso codice di codice principale su ciascun sito su cui lo utilizzo, fornendo un diverso tipo di profilo utilizzando un IOC. Potrei essere in grado di provare una classe base invece di un'interfaccia per questo scopo, ma non sono sicuro di cos'altro posso fare che mi dà la flessibilità che sto cercando. Guarderò il ModelType che hai menzionato. –
Una classe base vuota non ti farà molto bene neanche. Quindi nel tuo codice per il metodo CreateModel stai chiamando qualcosa come: IoC.GetInstance() che hai collegato per restituire un nuovo profilo standard? Interessante :). Non sono ancora chiaro il grado di riutilizzo del codice che è possibile ottenere quando tutto ciò che utilizza IProfile deve prima eseguire il cast della classe giusta, ma credo che la specifica del tipo nel contesto di binding funzionerà. –
anonymous
Il riutilizzo deriva dal fatto che molti dei controller del mio sito si trovano in un assembly comune a cui faccio riferimento. Ogni sito che costruisco fa riferimento a questo assembly comune per controller e modelli. Posso quindi aggiungere ulteriori controller, modelli, viste, ecc. Specifici per ogni sito. In questo caso, dovevo essere in grado di definire campi del profilo completamente diversi su base sito per sito. Da qui la necessità di una semplice interfaccia qui. –