gpt4 book ai didi

c# - MVC3 - Razor - 在 View 或下拉列表之间传输数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:29 25 4
gpt4 key购买 nike

我想让用户通过下拉列表或 field map 选择座位区 [现在只说下拉列表]在用户选择座位区并点击提交按钮后,我想加载另一个 View ,其中包含他们选择的座位区的表格。

这是座位区和 table [Tables] 的数据模型 .EDMX 的一部分(只是为了向您展示已设置的关系。)

EDMX Model

我尝试了 MVC3 Futures 序列化 - 无法让它按照我想要的方式工作

在他们的网站上看到这个例子后,我研究了 KnockoutJS:http://knockoutjs.com/examples/cartEditor.html以及当您选择类别时,产品在其旁边的下拉列表中如何变化。 (此方法目前可以​​使用)但无法从示例中弄清楚它是如何提取数据的)

最终,我想要 2 个 View (或者一个只隐藏座位区选择并显示餐 table 选择的 View )

Razor View - 用户将单击 [分配表] 以进入第一个 View ( View #1)

Click Assign Table

View #1:选择座位区[ Controller 代码]

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();
}

生成带有下拉菜单的 razor View :

View1 with drop-down

我最终会将其制作成一张显示不同楼层和座位区的 field map 。

在他们选择座位区后...我想重定向到另一个 View ,保留之前 View 中的数据 (SeatingAreaID),或者隐藏座位区选择并显示该座位区中的 table 。

[View #2 的部分 Controller 代码]

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

请让我知道处理此问题的最佳方法是什么。我相信我会不止这一次使用它。知道怎么做可能非常有值(value)。

这可能是一件很容易做到的事情,但我无法在任何地方找到任何关于如何按照我喜欢的方式做到这一点的信息。 SeatingAreaID 不是我想要在 View 之间传输的唯一变量,我还需要保持 VenueID 和 VipServiceID 一起传输,在选择表的最后, Controller 将创建多对多Table与VipService的关系,跳转回VipService详情页。

感谢您的宝贵时间和帮助。蒂姆

最佳答案

我继续使用我所知道的唯一方法,可能不是最好的方法,但它奏效了。如果有人有更好的方法来完成此任务,请告诉我。

我做了什么:

在用户选择“添加表格”按钮之后。

[ Controller 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 重定向到 Action AddTableToTable [ Controller 2] 并发送选定的 SeatingAreaId 和 VipServiceId

[ Controller 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();
}

渲染 View #2[ View #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 服务的 table 。在他们选择将 View 发布到 [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);
}

}

最终我会将下拉列表制作成 field 的视觉效果,这样用户只需触摸(点击)他们想要分配的区域和表格。

再一次,如果有人有更好的解决方案,请告诉我。

谢谢。

关于c# - MVC3 - Razor - 在 View 或下拉列表之间传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6674441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com