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.
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. –
qual è stato il problema con il primo suggerimento? Potresti postare la vista con questo suggerimento? –
Anche se ritengo che la mia precedente implementazione dovrebbe funzionare, ho aggiornato il mio codice per riflettere questo cambiamento. –