ASP .NET MVC - przekazywanie modelu między Get / Post

0

Cześć, przygotowałem pewien fragment kodu by zobrazować problem na jaki natrafiłem. Ogólnego sensu widoków, modeli proszę nie brać dosłownie - to tylko kod by zobrazować błąd. Najpierw przedstawię kod :
Model:

 public class User
    {
        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

ViewModel:

 public class UserViewModel
    {
        public List<User> Users { get; set; }
        public User User { get; set; }
        public UserViewModel()
        {
            Users = new List<User>();
            User = new User();
        }
    }

Kontroler:

 public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            UserViewModel model = new UserViewModel();
            User u1 = new User();
            u1.FirstName = "A";
            u1.LastName = "1";
            User u2 = new User();
            u2.FirstName = "B";
            u2.LastName = "2";
            model.Users.Add(u1);
            model.Users.Add(u2);
            return View(model);
        }
        [HttpPost]
        public ActionResult Index(UserViewModel model)
        {
            model.Users.Add(model.User);
            model.User = new User();
            return View(model);
        }
    }

Widok Index:

@model WebApplication1.Models.UserViewModel

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "table", InsertionMode = InsertionMode.InsertBefore }, new { enctype = "multipart/form-data", model = Model }))
{
    <input type="submit" value="Send Request">

    <div id="table">

        @{ Html.RenderPartial("UserPartial", Model);}
    </div>
}

Widok UserPartial:

@model WebApplication1.Models.UserViewModel
        <table>
            <thead>
                <tr>
                    <th>Imie</th>
                    <th>Nazwisko</th>

                </tr>
            </thead>
            <tbody>
                @foreach (var user in Model.Users)
                {
                    <tr>
                        <td>@user.FirstName</td>
                        <td>@user.LastName</td>
                    </tr>
                }
                <tr>
                    <td>@Html.TextBoxFor(x => x.User.FirstName)</td>
                    <td>@Html.TextBoxFor(x => x.User.LastName)</td>
                </tr>

            </tbody>
        </table>

Opis problemu : W metodzie Index (Get) przygotowuję pewne modele (2) i następnie przekazuję je do widoku. W danym widoku posiadam buttona "Send Request" który przenosi mnie do metody Post - jak dotąd jest okej, tylko teraz jest problem, parametr metody Post "model" nie przekazuje modeli które dodałem w metodzie Get, lecz tak jakby na nowo się inicjalizował. Wiem, że zamiast Ajax.BeginForm mógłbym użyć Html.BeginForm, ale zależy mi właśnie na wykorzystaniu ajaxa w tym przykładzie. Jest ktoś w stanie mi wytłumaczyć dlaczego w metodzie Post parametr jest na nowo inicjalizowany?

0

Wypluwa mi coś takiego : https://ibb.co/ZNBNKfB. Za bardzo nie wiem jak się posługiwać dokładnie dev toolem. Ale zauważyłem natomiast, że został utworzony dość dziwny link /?Length=4, w sumie nie wiem co on oznacza, na pewno nie ilość elementów listy, ale też nic innego nie przychodzi mi do głowy :/

1

Program działa tak jak napisałeś. Index wysyła viewmodel, w którym User = new User(). No to form Ci wysyła new User bo w form masz inputy tylko dla User.

Ogólnie. Ten viewmodel jest dziwny. Jak chcesz wysłać listę userow do widoku to wyślij listę. Viewmodel z lista Userow i jednym Userem to jakaś dziwna konstrukcja.
Jeśli ta lista ma być wysłana z widoku formularzem do metody Post to wszystkie dane listy powinny być w inputach w tym form. Inputy mogą być ukryte. Widok sie nie domysli co ma wysylac w form. Musisz mu to powiedzieć.
Jak dla mnie nie ma to sensu ale może to kwestia tego, że nie opisujesz prawdziwego problemu tylko jakiś dziwny przykład.
Nie wiem czy jest sens wysyłać listę do widoku aby pot3m ja przekazać do innej metody. Szczególnie jak używasz ajaxa.

Napisz co chcesz osiągnąć. Tak naprawdę.

0

Rozumiem, że w Index wypluwa mi User = new User(), ale nie mogę zrozumieć dlaczego rozmiar listy Users w metodzie Post = 0, zamiast 2 (w Get dodałem 2 elementy do listy)

0

Pisałem. Form wysyła to co jest w form. W inputach form nie masz listy z userami. To, że wcześniej wysyłasz do widoku wypełniona liste nie ma znaczenia bo to co wysyłasz do widoku magicznie nie przesyła się w form.
Pomijam, że raczej nie ma sensu takie wysyłanie.
Form tworzy NOWY viewmodel z tego co jest w form. Z inputow, które form zawiera i z danymi, które wpiszesz do inlutów. Nie wiem jak to prościej napisać.

0

Dzięki @jacek.placek , potrzebowałem trochę czasu i zrozumiałem o co biega. Dzięki jeszcze raz

1 użytkowników online, w tym zalogowanych: 0, gości: 1