2012-08-22 15 views
5

Ho un ViewModel che contiene due oggetti:Come passare un intero ViewModel al controller

public class LookUpViewModel 
{ 
    public Searchable Searchable { get; set; } 
    public AddToSearchable AddToSearchable { get; set; } 
} 

I due contenevano modelli di simile a questa:

public class Searchable 
{ 
    [Key] 
    public int SearchableId { get; set; } 
    public virtual ICollection<AddToSearchable> AddedData { get; set; } 
} 

public class AddToSearchable 
{ 
    [Key] 
    public int AddToSearchableId { get; set;} 
    [Required] 
    public int SearchableId { get; set; } 
    [Required] 
    public String Data { get; set; } 
    [Required] 
    public virtual Searchable Searchable { get; set; } 
} 

Ho una visione che usa il mio LookUpViewModel e riceve input per cercare uno SearchableId. Se viene trovato l'oggetto Searchable, un oggetto LookUpViewModel viene creato e passato alla vista. La vista visualizza quindi i campi dell'editor per AddToSearchable.Data. Una volta inviato, voglio che lo LookUpViewModel venga passato a un metodo di azione per gestire tutto il codice di back-end. L'unico problema è che il LookUpViewModel passato al mio metodo di azione contiene un riferimento null a Searchable e un riferimento valido a AddToSearchable .. ovvero mi manca la metà dei miei dati.

Ecco un esempio di ciò che la mia vista si presenta come:

@model HearingAidTrackingSystem.ViewModels.LookUpViewModel 

@using (Html.BeginForm("LookUp", "Controller", "idStr", FormMethod.Post)) 
{ 
    <input type="text" name="idStr" id="idStr"/> 
    <input type="submit" value="Search" /> 
} 

@if (Model.Searchable != null && Model.AddToSearchable != null) 
{ 
    using (Html.BeginForm("AddMyStuff", "Controller")) 
    { 
     Html.HiddenFor(model => model.Searchable.SearchableId); 
     Html.HiddenFor(model => model.Searchable.AddedData); 
     Html.HiddenFor(model => model.AddToSearchable.AddToSearchableId); 
     Html.HiddenFor(model => model.AddToSearchable.SearchableId); 
     Html.HiddenFor(model => model.AddToSearchable.Searchable); 

     <div class="editor-field"> 
      @Html.EditorFor(model => model.AddToSearchable.Data) 
      @Html.ValidationMessageFor(model => model.AddToSearchable.Data); 
     </div>          

     <input type="submit" value="Submit" /> 
    } 
} 

e qui sono i miei metodi di azione:

public ActionResult LookUp(LookUpViewModel vm) 
{ 
    return View(vm); 
} 

[HttpPost] 
public ActionResult LookUp(string idStr) 
{ 
    int id = /*code to parse string to int goes here*/; 

    Searchable searchable = dal.GetById(id); 
    LookUpViewModel vm = new LookUpViewModel { Searchable = searchable, 
               AddToSearchable = new AddToSearchable() }; 
    //When breakpoint is set, vm contains valid references 
    return View(vm); 
} 

[HttpPost] 
public ActionResult AddMyStuff(LookUpViewModel vm) 
{ 
    //**Problem lies here** 

    //Do backend stuff 
}  

Ci scusiamo per il lungo post. Ho fatto del mio meglio per mantenerlo semplice. Qualche suggerimento che potresti avere ... sparare.

risposta

5

due metodi per risolvere il problema:

  1. È possibile aggiungere a che fare HiddenFor() per tutte le proprietà di Model.Searchable.

  2. È possibile utilizzare la serializzazione per trasferire il modello. Sintonizzabile in presentazione di testo e ripararlo dal modulo serializzato nel controller.

Aggiornamento: Il problema è: È necessario utilizzare @ Html.HiddenFor(), non Html.HiddenFor() ;.

+0

Ho tentato il tuo primo suggerimento. Sfortunatamente, questo non ha risolto il mio problema. Il tuo secondo suggerimento potrebbe funzionare, ma ciò vanificherebbe lo scopo di avere un ViewModel. –

+0

qual è stato il problema con il primo suggerimento? Potresti postare la vista con questo suggerimento? –

+0

Anche se ritengo che la mia precedente implementazione dovrebbe funzionare, ho aggiornato il mio codice per riflettere questo cambiamento. –

Problemi correlati