MVC3 - Razor - передача данных между представлениями или списками DropDown - PullRequest
2 голосов
/ 13 июля 2011

Я хочу позволить пользователю выбрать зону отдыха с помощью раскрывающегося списка или карты места проведения (скажем, пока выпадающий список). После того, как пользователь выберет зону отдыха и нажмет кнопку отправки, я быхотел бы загрузить другой вид с таблицами для выбранной ими зоны отдыха.

Вот часть модели данных .EDMX для зоны отдыха и таблицы [Таблицы] (просто чтобы показать вам взаимосвязиустановлены.)

EDMX Model

Я попытался сериализовать фьючерсы MVC3 - Не удалось заставить его работать так, как я хотел

Я посмотрел на KnockoutJS, увидев этот примерна их веб-сайте: http://knockoutjs.com/examples/cartEditor.html и как при выборе категории продукты изменяются в раскрывающемся списке рядом с ней.(Этот метод пока работает), но не смог понять из примера, как он вытягивает данные)

В конечном счете, я хочу иметь 2 вида (или один вид, который просто скрывает выбор места для сидения ипоказывает выбор таблицы)

Razor View - пользователь щелкнет по [Assign Table], чтобы перейти к первому виду (view # 1)

Click Assign Table

Вид № 1: Выберите Гостиный уголок [Код контроллера]

public ActionResult AddTableTo(int id)
        {
            var tableService = id;
            var tableServiceName = db.VipServices.Single(x => x.VipServiceId == id);
            var venueId = tableServiceName.Event.Venue.VenueId;
            ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName;
            ViewData["TableServiceFor"] = tableService;

            ViewBag.SeatingAreaId = new SelectList(db.SeatingAreas.Where(y => y.VenueId == venueId), "SeatingAreaId", "AreaName");

            return View();
        }

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

View1 with drop-down

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

После того, как они выберут зону отдыха... Я хочу перенаправить в другое представление, сохраняя данные (SeatingAreaID) из предыдущего представления, или скрыть выбор места для сидения и показать таблицы в этом месте.

[Частичный код контроллера для просмотра# 2]

ViewBag.TableId = new SelectList(db.Tables.Where(y => y.SeatingAreaId == seatingAreaId), "TableId", "TableName");

Пожалуйста, дайте мне знать, как лучшео гендель это.Я уверен, что буду использовать это больше, чем просто один раз.Наверное, очень полезно знать, как это сделать.

Это может быть очень легко сделать, но я нигде не могу найти, как это сделать так, как мне бы хотелось.И SeatingAreaID - не единственная переменная, которую я буду хотеть передавать между представлениями, мне нужно сохранить передачу VenueID и VipServiceID также, в конце выбора таблицы, которую Контроллер собирается создать «многие ко многим»Связь между таблицей и VipService и перенаправление на страницу сведений о VipService.

Спасибо за ваше время и помощь.Тим

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Я пошел вперед и просто сделал это единственным известным мне способом, вероятно, не лучшим образом, но это сработало.Если у кого-то есть лучший способ сделать это, сообщите мне.

Что я сделал:

После того, как пользователь выберет кнопку Добавить таблицу.

[Контроллер 1a]

public ActionResult AddTableTo(Int64 id)
        {
            var tableService = id;
            var tableServiceName = db.VipServices.Single(x => x.VipServiceId == id);
            var venueId = tableServiceName.Event.Venue.VenueId;
            ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName;
            ViewData["TableServiceFor"] = tableService;

            ViewBag.SeatingAreaId = new SelectList(db.SeatingAreas.Where(y => y.VenueId == venueId), "SeatingAreaId", "AreaName");

            return View();
        }

[View # 1]

@model ShadowVenue.ViewModels.VipSeatingAreaViewModel
@{
    ViewBag.Title = "Select Seating Area";
}

<h2>Select Seating Area For:</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    <fieldset>
        <legend>@ViewData.Eval("TablerServiceNameFor")'s Table(s)</legend>

        <div class="editor-label">
            Select Seating Area
        </div>
        <div class="editor-field">
            @Html.DropDownList("SeatingAreaId", String.Empty)
        </div>
        @Html.Hidden("VipServiceId", ViewData.Eval("TableServiceFor"))
        <p>
            <input type="submit" name="nextButton" value="Next" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to Table Service Details", "Details", new { Id = ViewData.Eval("TableServiceFor") })
</div>

[Controller 1b]

[HttpPost]
[Authorize(Roles = "Administrator, SuperUser")]
public ActionResult AddTableTo(VipSeatingAreaViewModel seatingArea, string nextButton)
{
    if (nextButton != null)
        return RedirectToAction("AddTableToTable", new { sid = seatingArea.SeatingAreaId, vid = seatingArea.VipServiceId });
    return View(seatingArea);
}

Controller 1b Перенаправляет на действие AddTableToTable [Controller 2] и отправляет по выбранному SeatingAreaIdи VipServiceId

[Контроллер 2]

public ActionResult AddTableToTable(Int16 sid, Int64 vid)
        {
            var tableService = vid;
            var tableServiceName = db.VipServices.Single(x => x.VipServiceId == vid);
            var seatingAreaId = sid;
            var seatingArea = db.SeatingAreas.Single(x => x.SeatingAreaId == sid);

            ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName;
            ViewData["TableServiceFor"] = tableService;
            ViewData["SeatingAreaName"] = seatingArea.AreaName;

            ViewBag.TableId = new SelectList(db.Tables.Where(y => y.SeatingAreaId == seatingAreaId), "TableId", "TableName");

            return View();
        }

Визуализация Представление №2 [Представление №2]

@model ShadowVenue.ViewModels.VipTableViewModel
@{
    ViewBag.Title = "Select Table";
}

<h2>Select Table For:</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    <fieldset>
        <legend>@ViewData.Eval("TablerServiceNameFor")'s VIP Service</legend>

        <div class="editor-label">
            Select Table in the <b>@ViewData.Eval("SeatingAreaName")</b>  Seating Area
        </div>
        <div class="editor-field">
            @Html.DropDownList("TableId", String.Empty)
        </div>
        @Html.Hidden("VipServiceId", ViewData.Eval("TableServiceFor"))
        <p>
            <input type="submit" name="backButton" value="Back" />
            <input type="submit" name="nextButton" value="Next" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to Table Service Details", "Details", new { Id = ViewData.Eval("TableServiceFor") })
</div>

Я даю пользователю возможность вернуться квыберите другую гостиную или выберите стол для добавления в VIP-сервис.После того, как они выбирают сообщение для просмотра [controller 2b], где оно добавляет отношение «многие ко многим» для VipService и таблицы.

[controller 2b]

[HttpPost]
        [Authorize(Roles = "Administrator, SuperUser")]
        public ActionResult AddTableToTable(VipTableViewModel model, string backButton)
        {
            if (backButton != null)
            {
                return RedirectToAction("AddTableTo", new { id = model.VipServiceId });
            }

            if (ModelState.IsValid)
            {
                VipService v = db.VipServices.Single(x => x.VipServiceId == model.VipServiceId);
                Table t = db.Tables.Single(x => x.TableId == model.TableId);
                v.Tables.Add(t);

                db.SaveChanges();
                return RedirectToAction("Details", new { id = model.VipServiceId });
            }

            else
            {
                return View(model);
            }

        }

В конце концов ясобираюсь превратить DropDown List в визуальные элементы объекта, чтобы пользователь мог просто коснуться (щелкнуть) область и таблицы, которые он хочет назначить.

Еще раз, если у кого-то есть лучшее решение, пожалуйста, дайте мне знать.

Спасибо.

0 голосов
/ 14 июля 2011

Перво-наперво, я настоятельно рекомендую вам прекратить использовать свойство словаря ViewData для передачи данных из ваших контроллеров в представления.В любое время вы можете использовать ViewData, вы также можете использовать ViewModel.С ViewModel вам помогает компилятор, а не просто передает ключи в словарь.

Хорошее чтение можно найти здесь: http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx

Освоив использование шаблона ViewModel, вы легко сможете перемещать данные из вида в вид.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...