【问题标题】:Creating multiple instances of model in asp.net mvc project在 asp.net mvc 项目中创建模型的多个实例
【发布时间】:2019-12-25 01:46:44
【问题描述】:

项目的一点背景:

我是 asp.net 的新手,目前正在为一个学校项目苦苦挣扎,我需要为 GUI 制作一个原型,人们可以从中创建/更新/关闭产品状态,该产品状态将发送给人们产品出现问题时通过邮件发送。我的想法是垂直分割屏幕,您在左侧将写入邮件中应包含的信息(产品状态),右侧显示当前产品状态列表,您可以从中选择更新 og 关闭一个给定的。

问题:

我的问题是我找不到制作模型的多个实例的方法。我已经创建了一个测试模型、控制器和视图来了解如何做,现在将列出这些:

下面是我的模型,它将保存邮件的信息

public class ProductStatus {
        public string MailTitel { get; set; } // Could be "The casino game Bonanza is not working"
        public string Status { get; set; }    // Could be "Start", "Ongoing", "Ended"
        public string Description { get; set; } // Could be "Incident created at provider"
}

下面是我的控制器:

public class HomeController : Controller
    {
        List<ProductStatus> statusList = new List<ProductStatus> {};

        public ActionResult Index()
        {
            ProductStatus model = new ProductStatus();
            ViewData["Status"] = statusList;
            return View(model);
        }

        public ActionResult SendMessages(ProductStatus status) {
            statusList.Add(status);
            ViewData["Status"] = statusList;
            return View("Index");
        }
    }

为了测试我的实现,我创建了这个视图:

@{
    ViewBag.Title = "Productstatus";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using DS_Prototype.Models
@model DS_Prototype.Models.ProductStatus
<!--Left side - Info filling -->
<div class="split left">
    @using (Html.BeginForm("SendMessages", "Home", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.TextBoxFor(model => model.MailTitel)
        <button type="submit" class="btn btn-block btn-login">Submit</button>
    }
</div>

<!--Right side - Status overview -->
<div class="split right">
    @foreach (ProductStatus status in ViewData["Status"] as List<ProductStatus>)
    {
        <a>@status.MailTitel</a>
    }
</div>

当我填写左侧并单击按钮时,正确的字符串会显示在右侧,但是当我再次单击按钮时,它只会更新字符串并且不会在另一个字符串下显示新字符串。

我知道使用 ViewData 不是最佳方式,但我无法让 [httpPost] / [httpGet] 工作(我认为您可以通过某种方式使用它们)。

希望有人能帮助我,在此先感谢!

【问题讨论】:

  • 每个请求都会生成一个新的控制器,因此 statusList 会被清除。您将需要使用 ViewState 之类的东西来持久化。见here

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


【解决方案1】:

如果我理解正确的话,当您第一次在文本框中输入一个值并单击提交时,该值会显示在您页面的右侧。当您将不同的值放入框中并再次提交时,您希望右侧显示第一个和第二个值。对吗?

假设这是您想要的,那么要记住的是 HTTP 是无状态的,这意味着每次您发出新请求时,您都是从头开始。因此,当您第二次提交表单时,页面不会记住第一个条目。 ViewData 不会在请求之间持续存在,您的 statusList 也不会,因为每次创建控制器(即每个请求)时都会创建新的。

最好的办法是使用 Session 来保存之前提交的值。

public class HomeController : Controller
{

    public ActionResult Index()
    {
        ProductStatus model = new ProductStatus();
        List<ProductStatus> statusList = (List<ProductStatus>)Session["ProductStatuses"];
        if (statusList != null)
            ViewData["Status"] = statusList;
        return View(model);
    }

    public ActionResult SendMessages(ProductStatus status) 
    {
        List<ProductStatus> statuses = (List<ProductStatus>)Session["ProductStatuses"];
        if (statuses == null)
        {
             statuses = new List<ProductStatus>();
             Session["ProductStatuses"] = statuses;
        }
        statusList.Add(status);
        ViewData["Status"] = statusList;
        return View("Index");
    }
}

【讨论】:

  • 我喜欢 Session 建议,但是如果没有 List&lt;ProductStatus&gt; statusList = (List&lt;ProductStatus&gt;)Session["ProductStatuses"]; 在您的索引操作中,您的列表将不会保留
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2021-01-05
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多