Tengo un modelo de vista que contiene dos objetos:Cómo pasar todo un modelo de vista de vuelta al controlador
public class LookUpViewModel
{
public Searchable Searchable { get; set; }
public AddToSearchable AddToSearchable { get; set; }
}
Los dos contenían modelos ser algo como esto:
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; }
}
tengo una opinión de que usa mi LookUpViewModel
y recibe entrada para buscar un SearchableId
. Si se encuentra el objeto Searchable
, se crea un objeto LookUpViewModel
que se pasa a la Vista. La vista luego muestra campos de editor para AddToSearchable.Data
. Una vez enviado, quiero que el LookUpViewModel
pase a un método de acción para manejar todo el código de back-end. El único problema es que el LookUpViewModel
pasado a mi método de acción contiene una referencia nula a Searchable
y una referencia válida a AddToSearchable
... es decir, me falta la mitad de mis datos.
He aquí un ejemplo de lo que mi vista se parece a:
@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" />
}
}
y aquí están mis métodos de acción:
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
}
Lo siento por el extenso post. Hice todo lo posible para mantenerlo simple. Cualquier sugerencia que pueda tener ... dispare.
Intenté su primera sugerencia. Desafortunadamente, esto no solucionó mi problema. Su segunda sugerencia puede funcionar, pero eso sería contrario al propósito de tener un ViewModel. –
¿cuál fue el problema con la primera sugerencia? ¿Podría publicar vista con esta sugerencia? –
Aunque creo que mi implementación anterior debería funcionar, he actualizado mi código para reflejar este cambio. –