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.
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. –
jaki był problem z pierwszą sugestią? Czy możesz opublikować widok z tą sugestią? –
Chociaż wydaje mi się, że moja poprzednia implementacja powinna działać, zaktualizowałem swój kod, aby odzwierciedlić tę zmianę. –