MVC4 Передача модели из представления в контроллер

У меня есть вид с моделью, заполненной данными, касающимися бронирования такси.

В модели представлен список котировок с указанием времени, цены, типа транспортного средства, в котором я показываю список использования foreach. Каждый раз, когда петли foreah строят форму и кнопку отправки, я могу перейти к действию "BookingStage1" в контроллере. Я также добавил скрытое поле, которое заполняется с помощью резервирования для конкретной цитаты.

Итак, я надеялся, что когда он попадет в результат действия моего контроллера, модель будет возвращена полностью заполненной так же, как и с видом. Но это нулевое значение, никаких данных в нем вообще.

Я надеялся передать заполненную модель между несколькими контроллерами, когда пользователь продвигается по различным экранам поиска, результатов и бронирования...

Можно ли передать полностью заполненную модель обратно из представления в следующий контроллер?

Спасибо

На моей странице "Результаты поиска" у меня есть следующая форма:

using (Html.BeginForm("BookingPage1", "SearchResults", FormMethod.Post))

У меня также есть скрытое поле в форме, как показано ниже:

<input type="hidden" id="BookingID" name="ChosenBookingID" value='@item.QuotationID' />

который отправляется на мой контроллер, который выглядит следующим образом:

[HttpPost]
    public ActionResult BookingPage1(string ChosenBookingID, Route theRoute)
    {
        //this does noting yet.
        return View();
    }

Но theRoute всегда пуст: (

Ответ 1

Я надеюсь, что этот полный пример поможет вам.

Это класс TaxiInfo, который содержит информацию о поездке на такси:

namespace Taxi.Models
{
    public class TaxiInfo
    {
        public String Driver { get; set; }
        public Double Fare { get; set; }
        public Double Distance { get; set; }
        public String StartLocation { get; set; }
        public String EndLocation { get; set; }
    }
}

У нас также есть удобная модель, которая содержит Список TaxiInfo (s):

namespace Taxi.Models
{
    public class TaxiInfoSet
    {
        public List<TaxiInfo> TaxiInfoList { get; set; }

        public TaxiInfoSet(params TaxiInfo[] TaxiInfos)
        {
            TaxiInfoList = new List<TaxiInfo>();

            foreach(var TaxiInfo in TaxiInfos)
            {
                TaxiInfoList.Add(TaxiInfo);
            }
        }
    }
}

Теперь в домашнем контроллере установлено действие Index по умолчанию, которое для этого примера составляет два водителя такси и добавляет их в список, содержащийся в TaxiInfo:

public ActionResult Index()
{
    var taxi1 = new TaxiInfo() { Fare = 20.2, Distance = 15, Driver = "Billy", StartLocation = "Perth", EndLocation = "Brisbane" };
    var taxi2 = new TaxiInfo() { Fare = 2339.2, Distance = 1500, Driver = "Smith", StartLocation = "Perth", EndLocation = "America" };

    return View(new TaxiInfoSet(taxi1,taxi2));
}

Код для представления выглядит следующим образом:

@model Taxi.Models.TaxiInfoSet
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@foreach(var TaxiInfo in Model.TaxiInfoList){
    <form>
        <h1>Cost: [email protected]</h1>
        <h2>Distance: @(TaxiInfo.Distance) km</h2>
        <p>
            Our diver, @TaxiInfo.Driver will take you from @TaxiInfo.StartLocation to @TaxiInfo.EndLocation
        </p>
        @Html.ActionLink("Home","Booking",TaxiInfo)
    </form>
}

ActionLink отвечает за перенаправление на действие резервирования контроллера Home (и переход в соответствующий объект TaxiInfo), который определяется следующим образом:

    public ActionResult Booking(TaxiInfo Taxi)
    {
        return View(Taxi);
    }

Это возвращает следующий вид:

@model Taxi.Models.TaxiInfo

@{
    ViewBag.Title = "Booking";
}

<h2>Booking For</h2>
<h1>@Model.Driver, going from @Model.StartLocation to @Model.EndLocation (a total of @Model.Distance km) for [email protected]</h1>

Визуальный тур:

The Index view

The Booking view