【问题标题】:How to transfer database info to another controller in asp.net mvc如何将数据库信息传输到 asp.net mvc 中的另一个控制器
【发布时间】:2025-11-24 07:20:09
【问题描述】:

我的目标:用户从列表中选择一个项目(来自数据库的项目列表),该项目将显示在另一个页面上。

我想从数据库中传输密钥,该密钥是在一个控制器中选择的,并且可以从另一个控制器访问这个选择的密钥。

我的数据库是由我的模型之一 Entity Framework 创建的。

我的数据库模型:

public class Apartment
{
    // id of apartment
    [HiddenInput(DisplayValue = false)]
    public int ApartmentId { get; set; }

    // quantity in apartment
    [Required(ErrorMessage = "Поле должно быть установлено")]
    public int Quantity { get; set; }

    // class of apartment
    [Required(ErrorMessage = "Поле должно быть установлено")]
    public Classes Class { get; set; }

    // price of apartment
    [Required(ErrorMessage = "Поле должно быть установлено")]
    public int Price { get; set; }

    // start of book apartment
    [Required(ErrorMessage = "Поле должно быть установлено")]
    public DateTime Start { get; set; }

    // end of book apartment
    public DateTime End { get; set; }
}

// Class apartment in enum
public enum Classes
{
    Economy,
    Standard,
    Luxury
}

查看,用户选择他的公寓:

foreach (Hotel.DAL.Entities.Apartment a in Model)
{
    <div id="ap" class="col-md-3">
        <p>Class: @a.Class
        <p>Quantity: @a.Quantity человек
        <p>Price for one day: @a.Price $

        @if (ViewBag.TimeInt != null)
        {
            ViewBag.FullPrice = a.Price * ViewBag.TimeInt;
            <p>Full price: @ViewBag.FullPrice $</p>
        }

        @if (HttpContext.Current.Request.HttpMethod == "POST")
        {
            <form asp-action="Index" method="post">
                <p>
                    <button value="Open Window" onclick="window.open('/Home/Confirm')" class="btn btn-primary">Book</button>
                    <input type="hidden" name="id" value="@a.ApartmentId" />
                </p>
            </form>
        }
</div>
}

隐藏类型是一个输入,我在其中获取我的键的值。

控制器视图方法:

public ActionResult Index(string sortOrder)
{
    ViewData["ClassSortParm"] = sortOrder == "Class" ? "class_desc" : "Class";
    ViewData["PriceSortParm"] = sortOrder == "Price" ? "price_desc" : "Price";

    var p = from s in dbshow.GetList()
            select s;

    switch (sortOrder)
    {
        case "class_desc":
            p = dbshow.GetList().OrderByDescending(s => s.Class);
            break;

        case "price_desc":
            p = dbshow.GetList().OrderByDescending(s => s.Price);
            break;

        default:
            p = dbshow.GetList().OrderBy(s => s.Class);
            break;
    }

    return View(p);
}

// filters to book apartments
[HttpPost]
public ActionResult Index(string sortOrder, Classes? Class, int? quantity, DateTime? start, DateTime? end, bool? check)
{
    ViewData["CurrentQuan"] = quantity;
    ViewData["CurrentClass"] = Class;
    ViewData["CurrentStart"] = start;
    ViewData["CurrentEnd"] = end;
    ViewData["CurrentCheck"] = check.GetValueOrDefault();

    ViewData["ClassSortParm"] = sortOrder == "Class" ? "class_desc" : "Class";
    ViewData["PriceSortParm"] = sortOrder == "Price" ? "price_desc" : "Price";

    var aps = from s in dbshow.GetList()
              select s;

    return View(aps);
}

我需要传输 ApartmentId (key) 的控制器是默认的:

public ActionResult Confirm()
{
    return View();
}

我听说通过 cookie 可以更好地做到这一点。但我不知道怎么做。

【问题讨论】:

    标签: c# asp.net-mvc post model-view-controller controller


    【解决方案1】:

    您可以创建 cookie 并读取 cookie 的内容,也可以使用会话。 参见示例:https://andrewlock.net/an-introduction-to-session-storage-in-asp-net-core/

    或者另一种解决方案是将他们的选择保存在数据库中,然后在需要的地方获取。

    更新: 编辑表单以将密钥发布到 /confirm/,因此无需在 cookie 或会话中保留此值

    【讨论】:

    • 有多种方法可以存储和检索您的键值。您可以根据自己的需要选择一种。 1. 使用 cookie 存储密钥 2. 将密钥添加到您的页面查询字符串中:设置和获取它非常容易。 3.使用数据库队列来存储它。最后使用页面会话:如果您的应用程序扩展到多台机器,请确保这将无法正常工作
    • @Moe Jallaq 我尝试使用查询字符串:你能解释一下吗,我需要在我的索引控制器(方法发布)中初始化 f.ex.:string Id = Request.QueryString["id"];
    • 或者既然你用的是mvc:return RedirectToAction("Confirm", "MyController", new { input = "myInput"});
    • 我在确认视图中使用了 @Noobie 1 变体,这是本地主机错误。第二个变体:我只是在 Confirm 控制器中更改了返回字符串,那是错误的地址。很可能我不完全理解你的意思。 :(
    • 哦,我刚刚意识到,您正在使用隐藏字段“key”发布到“/Home/Confirm/”,我认为这是您需要的键?那是对的吗?然后在您的控制器中,您需要从表单中读取数据,例如[FromForm] MyForm 表单。如果 Confirm 方法在不同的控制器中,则需要指定控制器和操作 &lt;a asp-controller="Speaker" asp-action="Index"&gt;All Speakers&lt;/a&gt; 并将方法标记为 POST
    最近更新 更多