2012-08-22 16 views
5

Mam ViewModel, który zawiera dwa obiekty:Jak przekazać całą ViewModel z powrotem do kontrolera

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

Dwa zawartych modele wyglądać tak:

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; } 
} 

mam pogląd, że używa mojego LookUpViewModel i otrzymuje dane wejściowe do wyszukiwania SearchableId. Jeśli zostanie znaleziony obiekt Searchable, zostanie utworzony obiekt LookUpViewModel i przekazany do widoku. Widok wyświetla pola edytora dla AddToSearchable.Data. Po przesłaniu chcę, aby LookUpViewModel został przekazany do metody działania w celu obsłużenia całego kodu back-end. Jedynym problemem jest to, że LookUpViewModel przekazana do mojej metody działania zawiera zerową referencję do Searchable i prawidłową referencję do AddToSearchable .. tj. Brakuje mi połowy moich danych.

Oto przykład tego, co moim zdaniem wygląda następująco:

@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" /> 
    } 
} 

i tutaj są moje metody działania:

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 
}  

Przepraszamy za długiego słupka. Starałem się, aby wszystko było proste. Wszelkie sugestie, jakie możesz mieć ... odpal.

Odpowiedz

5

dwa sposoby, aby to naprawić:

  1. Możesz dodać zrobić HiddenFor() dla wszystkich właściwości Model.Searchable.

  2. Możesz użyć serializacji do przeniesienia Model.Searchable do prezentacji tekstowej i naprawy z serializowanej postaci w kontrolerze.

Aktualizacja: Problem polega na: Musisz użyć @ Html.HiddenFor(), nie Html.HiddenFor() ;.

+0

Próbowałem twojej pierwszej sugestii. Niestety to nie rozwiązało mojego problemu. Twoja druga sugestia może zadziałać, ale to by złamało cel posiadania ViewModel. –

+0

jaki był problem z pierwszą sugestią? Czy możesz opublikować widok z tą sugestią? –

+0

Chociaż wydaje mi się, że moja poprzednia implementacja powinna działać, zaktualizowałem swój kod, aby odzwierciedlić tę zmianę. –

Powiązane problemy