2011-09-07 2 views
5

Non sono nuovo in questo, quindi scuse se questo non è abbastanza esplicativo. Voglio prepopolare un campo in un modulo in asp.net mvc 3. Funziona;prepopolato Html.TextBoxFor in asp.net mvc 3

@Html.TextBox("CompName", null, new { @value = ViewBag.CompName }) 

Ma quando voglio precompilare con un valore e inviare tale valore al mio modello, in questo modo;

@Html.TextBoxFor(model => model.Comps.CompName, null, new { @value = ViewBag.CompName }) 

Non funzionerà. Qualche idea?

Grazie in anticipo!

risposta

15

Quindi, vorrei suggerire è di passare a utilizzare viewmodels piuttosto che il ViewBag. Ho creato una cartella nel mio progetto, denominata ViewModels, e in seguito creo alcune sottocartelle, come appropriato, dove ho inserito i miei vari viewmodels.

Se si crea una classe ViewModel in questo modo:

public class MyViewModel 
{ 
    public string CompName { get; set; } 
} 

poi nella vostra azione di controllo è possibile creare uno di quelli e popolare, forse da qualche modello esistente tirato da un database. Impostando la proprietà CompName nel viewmodel, avrà quel valore nella vista. E allora la vostra vista può essere simile a questa:

@model MyNamespace.ViewModels.MyViewModel 

@Html.EditorFor(model => model.CompName) 

o @Html.TextBoxFor avrebbe funzionato troppo.

Poi di nuovo nella vostra azione di controllo sul palo, hai qualcosa di simile:

[HttpPost] 
public ActionResult MyAction(MyViewModel viewModel) 
{ 
    ... 
    // do whatever you want with viewModel.CompName here, like persist it back 
    // to the DB 
    ... 
} 

potrebbe essere che si usa qualcosa come automapper per mappare i vostri modelli e ViewModels ma si potrebbe certamente farlo manualmente anche se l'intera faccenda di mano destra/sinistra diventa piuttosto noiosa.

Rende le cose molto più semplici se lo fai in questo modo e non funziona molto.


Aggiornamento

Ma, se si davvero desidera passare tale valore secondo la ViewBag, si potrebbe fare questo:

Nella vostra azione di controllo:

ViewBag.CompName = "Some Name"; 

Quindi a tuo avviso:

@Html.TextBoxFor(model =>model.Comps.CompName, new {@Value = ViewBag.CompName}) 

E questo pre-popolerà la casella di testo con "Qualche nome".

Continuerò comunque con l'approccio viewmodel, ma questo sembra funzionare abbastanza bene. Spero possa aiutare!

+0

Grazie per la sua risposta itsmatt.Il viewbag è nella mia azione di concorso get-enter e prende il nome dal mio modello "Competition" (c'è anche un modello CompetitionEntry (.) È così che posso visualizzare il nome della competizione in cima al modulo di iscrizione. modello Ho una proprietà di navigazione "Competizioni di competizione virtuale pubblica" .Pensavo che ci sarebbe stato facile precompilare il TextBox di CompetitionEntry.CompName con quello che si trova nel viewbag. Non voglio cambiare i miei modelli in questa fase per essere onesti, sai di un modo per farlo nella vista? Grazie ancora. – Dan

+0

Dan, guarda il mio aggiornamento alla fine della mia risposta. Sembra che funzioni abbastanza bene nel mio progetto di test – itsmatt

+0

Non riuscirò a prova questo per un'ora circa, ti scriverò quando lo farò Grazie per tutto ciò che aiuti matt! – Dan

3

Dal controller, se si passa un modello inizializzato con valori predefiniti utilizzando uno degli overload del metodo View(...) che accetta un oggetto modello, questi valori verranno utilizzati dalla vista durante il rendering. Non è necessario utilizzare la sintassi @value = ....