【问题标题】:why custom type variable is not saving value MVC为什么自定义类型变量不保存值 MVC
【发布时间】:2017-12-20 10:01:19
【问题描述】:

我正在尝试使用 MVC 5 构建网站。 我有一个带有 3 个变量的控制器类。

public class WorkerController : Controller
{
    public ViewModel viewModel = new ViewModel();

    private WorkerDB Wdb = new WorkerDB();
    private ProjectDB Pdb = new ProjectDB();

第一个被调用的方法是

    public ActionResult Index(User user)
    {
        viewModel.User = user;
        viewModel.ProjectsList = Pdb.DbSet.ToList();
        viewModel.WorkerList = Wdb.DbSet.ToList();

        return View(viewModel);
    }

这里存储了 viewModel 数据类型的值。 然后将 viewModel 传递给 View。 视图返回另一种类型的变量并调用另一种方法。

[HttpPost]
public ActionResult StartStopTime(Worker worker)
{
    return RedirectToAction("Index", viewModel);
}

在这个方法里面,viewModel 是空的,我不明白为什么。

被调用的视图:

@using System
@using WebApplication2.Models
@using WebApplication2.ViewModels

@model ViewModel

@{
    Worker worker = new Worker();

    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Worker</title>
</head>
<body>

<div>
    @foreach(var i in Model.WorkerList)
    {
        if ((i.Nume == Model.User.Username) && (i.Prenume == Model.User.Password))
        {
            worker = i;
            break;
        }
    }
    <br />
</div>

<div> 
    Salut @Model.User.Username
    @foreach (var item in Model.ProjectsList)
    {
        <br>
        @item.Numar
    }
</div>

<br />
<br />


<form action="/Worker/StartStopTime" method="post">
    <input type="hidden" name="ID" value="@worker.ID" />
    <input type="hidden" name="Nume" value="@worker.Nume" />
    <input type="hidden" name="Prenume" value="@worker.Prenume" />
    <input type="text" name="Proiect" value="" required />
    <input type="hidden" name="Start" value="@DateTime.Now.ToString()" />
    <input type="hidden" name="Stop" value="@DateTime.Now.ToString()" />
    <input type="submit" name="submit" value="Start/Stop" />
</form>

全班:

public class WorkerController : Controller
{
    public ViewModel viewModel = new ViewModel();

    private WorkerDB Wdb = new WorkerDB();
    private ProjectDB Pdb = new ProjectDB();

    // GET: Worker
    public ActionResult Index(User user)
    {
        viewModel.User = user;
        viewModel.ProjectsList = Pdb.DbSet.ToList();
        viewModel.WorkerList = Wdb.DbSet.ToList();

        return View(viewModel);
    }

    [HttpPost]
    public ActionResult StartStopTime(Worker worker)
    {
        return RedirectToAction("Index", viewModel);
    }
}

如果有人可以告诉我在哪里可以找到答案。谢谢!

【问题讨论】:

  • public ActionResult StartStopTime(Worker worker) { return RedirectToAction("Index", viewModel); }...viewModel 未在此方法中定义或填充。不要忘记 HTTP 是无状态的,变量值不会在请求之间持续存在,除非您将它们存储在某个地方。
  • 非常感谢您的回答,帮助很大!

标签: c# .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

如果你需要在请求之间持久化数据,你应该使用TempData

public ActionResult Index(User user)
{
    var viewModel = new ViewModel();
    viewModel.User = user;
    viewModel.ProjectsList = Pdb.DbSet.ToList();
    viewModel.WorkerList = Wdb.DbSet.ToList();

    TempData["MyViewModel"] = viewModel;

    return View(viewModel);
}

当您执行下一个请求时(例如下面的发布请求),您可以检索它:

[HttpPost]
public ActionResult StartStopTime(Worker worker)
{
    var viewModel = TempData["MyViewModel"] as ViewModel;
    return RedirectToAction("Index", viewModel);
}

请注意,当您从 TempData 读取数据时,该值已标记为删除,并且在下一个请求(在您的情况下为第三个请求)将不可用。如果您想在下一个请求中读取数据并使其保持活动状态,则可以这样做:

[HttpPost]
public ActionResult StartStopTime(Worker worker)
{
    var viewModel = TempData.Peek("MyViewModel") as ViewModel;
    return RedirectToAction("Index", viewModel);
}

通过使用Peek()TempData 中存储的值不会被标记为删除。

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2019-06-16
    • 2022-06-15
    • 1970-01-01
    • 2019-08-27
    • 2021-04-11
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多