Bądźcie ze mną, ponieważ wyjaśnienie problemu, który widzę, może być dość trudne, smażę mózg, ponieważ nie ma to sensu (lub brakuje mi kluczowego elementu logiki).
Mam obiekt modelu widoku A
że przechodzę z kontrolera do mocno napisanego widoku B
który oczekuje modelu A
"s. Kiedy zawijam HTML w widoku B
w @using (Html.BeginForm(...))
blok (próbowałem z obu FormMethod.Post
i FormMethod.Get
tylko w celu przetestowania), środowisko wykonawcze zgłasza wyjątek, gdy działa na następujący kod:
@for (int i = 0; i < Model.DataTable.Columns.Count; i++)
Ponieważ Model
w powyższym kodzie ma wartość null. Przeszedłem przez akcję, która zwraca model widoku A
obejrzeć B
aby upewnić się, że nie przechodzę w modelu zerowym i mogę zagwarantować, że nie. W rzeczywistości istnieją pewne linie, w których używam LINQ do generowania HTML (np. yFor (x => x.Report.Name )) BEFORE the aforementioned
dla pętli for`, a te linie są przetwarzane w porządku. Kiedy usuwam blok enkapsulacji, działa dobrze.
Kicker polega na tym, że praktycznie identyczny kod działa w innych widokach z innymi modelami widoków. Używam tego samego stylu for
zapętlić w innym widoku C
który oczekuje modelu widoku D
, i wszystko jest zamknięte w `` bloku, z jakim próbuję sobie poradzić A
i B
.
EDYTOWAĆ: Oto, jak to wygląda. Mam nadzieję, że to wystarczy. Obawiam się, że nie mogę dać dużo więcej.
/* here is a very basic controller action */
[HttpGet]
public ActionResult View()
{
ViewModel vm = new ViewModel();
vm.Name = "view model test";
vm.Table = new DataTable();
return View(vm);
}
/* here is the view */
@model MyMVCProject.Models.ViewModel
@using (Html.BeginForm("View", "Controller", FormMethod.Post))
{
<h2>Test for: </h2>
@Html.DisplayFor(x => x.Name)
<p>Rows</p>
@for (int i = 0; i < Model.Table.Rows.Count; i++)
{
<p>@Model.Table.Rows[i].Name</p>
}
<input type="submit" value="OK"/>
}
Odpowiedzi:
1 dla odpowiedzi № 1Ach ... to takie zawstydzające. Jestem pewien, że kompilator był pomylony między mną View
akcja i View
typ, który zwracam w akcji. Zmieniłem nazwę akcji i wszystko działa zgodnie z oczekiwaniami.