W moim viewmodel, mam listę elementów I pobrania z bazy danych, a następnie wysłać do widoku. Chciałbym wiedzieć, czy można uniknąć konieczności uzupełniania właściwości opcji za każdym razem, gdy kliknę akcję Post i trzeba zwrócić model (w przypadku błędów sprawdzania poprawności, a co nie)?modelowe Reuse dane w działaniu postu
W webforms, to nie będzie konieczne.
Edit: I nie było jasne. Mój problem dotyczy opcji SelectList, których używam dla moich DropDownLists. Wszystko zostaje opublikowane, ale jeśli muszę wrócić do widoku (model jest nieprawidłowy), muszę przeładować opcje z bazy danych! Chcę wiedzieć, czy można tego uniknąć.
Moje ViewModel:
public class TestModel
{
public TestModel()
{
Departments = new List<SelectListItem>();
}
public string Name { get; set; }
public int Department { get; set; }
public IEnumerable<SelectListItem> Departments { get; set; }
}
Moim zdaniem:
@model MvcApplication1.Models.TestModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(m => m.Name)
@Html.DropDownListFor(m => m.Department, Model.Departments)
<input type=submit value=Submit />
}
Mój kontroler (nie zauważyć komentarz na HttpPost):
public ActionResult Index()
{
TestModel model = new TestModel
{
Name = "Rafael",
Department = 1,
Departments = new List<SelectListItem>
{
new SelectListItem { Text = "Sales", Value = "1" },
new SelectListItem { Text = "Marketing", Value = "2", Selected = true },
new SelectListItem { Text = "Development", Value = "3" }
}
};
// Departments gets filled from a database.
return View(model);
}
[HttpPost]
public ActionResult Index(TestModel model)
{
if (!ModelState.IsValid)
{
//Do I have to fill model.Departments again!?!?!?
return View(model);
}
else { ... }
}
góry dzięki.
Edytuj: FYI, moim rozwiązaniem było użycie zmiennej Session
.
Chcesz zobaczyć moją edycję? – rebelliard
OK Rozumiem, co masz teraz na myśli. Ten sam problem pojawił się przy moim ostatnim projekcie. Niestety, użycie wpisu HTTP z natury rzeczy ograniczy model do odpowiednika par klucz-wartość. Oznacza to, że nie można mieć złożonego modelu z większą liczbą obiektów biznesowych jako właściwości zwróconych do kontrolera. Więc będziesz musiał przechowywać listę oddziałów gdzieś uporczywie. Sesja będzie odpowiednia do tego, o ile oczyścisz ją, gdy skończysz. Jeśli naprawdę, naprawdę musisz wysłać obiekty przez przewód, musisz użyć JSON lub innej techniki serializacji. – jhsowter
Rozumiem. Czy poleciłbyś przekazanie danych z JSON wewnątrz ukrytego wejścia lub obiektu Session []? Dzięki. – rebelliard