2012-08-22 16 views
5

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.

Respuesta

5

Dos métodos para solucionarlo:

  1. se pueden agregar a hacer HiddenFor() para todas las propiedades de Model.Searchable.

  2. Puede utilizar la serialización para transferir su Model.Searchable a la presentación de texto y repararlo de forma serializada en el controlador.

Actualización: El problema es: ¿Es necesario utilizar @ Html.HiddenFor(), no Html.HiddenFor() ;.

+0

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. –

+0

¿cuál fue el problema con la primera sugerencia? ¿Podría publicar vista con esta sugerencia? –

+0

Aunque creo que mi implementación anterior debería funcionar, he actualizado mi código para reflejar este cambio. –

Cuestiones relacionadas