当前位置: 首页 > 知识库问答 >
问题:

为什么viewbag值没有传回视图?

洪琦
2023-03-14

直截了当的问题是,似乎无法在用户完成表单后指向的视图中显示我的viewBag值。

请指教...谢谢

我的索引操作结果简单返回模型数据。

public ActionResult Index()
{
    var source = _repository.GetByUserID(_applicationUser.ID);
    var model = new RefModel
    {
        test1 = source.test1,
    };
    return View(model);
}

my Get Edit”action result,只是使用相同的模型数据作为索引。

My Post"Edit"ActionResult,将新值(如果有)分配给模型并重定向到Index页面,但Index页面不显示ViewBag值??

[HttpPost]
public ActionResult Edit(RefModell model)
{
    if (ModelState.IsValid)
    {
        var source = _repository.GetByUserID(_applicationUser.ID);
        if (source == null) return View(model);

        source.test1 = model.test1;
        _uow.SaveChanges();

        @ViewBag.Message = "Profile Updated Successfully";
        return RedirectToAction("Index");      
    }
    return View(model);
}

在我的索引视图中。。。

@if(@ViewBag.Message != null)
{
    <div>
        <button type="button">@ViewBag.Message</button>
    </div>
}

共有3个答案

汝开畅
2023-03-14

重定向操作(msdn)指示浏览器发出新请求
因此,您的服务器将再次被调用,但这将是一个新请求,其中包含一个空白的viewbag,所有
您可以通过调用index方法进行某种内部重定向,这样viewbag仍将保留其数据。

编辑 :您还必须修改索引方法,否则视图(模型)行将尝试呈现编辑。
完整代码如下

public ActionResult Index()
{
    var source = _repository.GetByUserID(_applicationUser.ID);
    var model = new RefModel
    {
        test1 = source.test1,
    };
    return View("Index",model);
}


[HttpPost]
public ActionResult Edit(RefModell model)
{
    if (ModelState.IsValid)
    {
        var source = _repository.GetByUserID(_applicationUser.ID);
        if (source == null) return View(model);

        source.test1 = model.test1;
        _uow.SaveChanges();

        @ViewBag.Message = "Profile Updated Successfully";
        return Index();      
    }
    return View(model);
}
狄奕
2023-03-14

RedirectToAction导致HTTP 302响应,这使客户端再次调用服务器并请求新页面。

您应该返回视图,而不是重定向。

姬成荫
2023-03-14

ViewBag 仅针对当前请求而存在。在你的情况下,你正在重定向,所以你可能存储在ViewBag中的所有内容都将随着当前请求而死亡。仅当呈现视图时才使用 ViewBag,而不是打算重定向时使用 ViewBag。

请改用 TempData

TempData["Message"] = "Profile Updated Successfully";
return RedirectToAction("Index");

然后在你看来:

@if (TempData["Message"] != null)
{
    <div>
        <button type="button">@TempData["Message"]</button>
    </div>
}

在幕后,TempData将使用会话,但一旦您从中读取记录,它将自动退出。因此,它基本上是用于短期存储的。

或者,如果您不想依赖会话,您可以将它作为查询字符串参数传递(这可能是我会做的)。

 类似资料:
  • 本文向大家介绍为什么Java中只有值传递?相关面试题,主要包含被问及为什么Java中只有值传递?时的应答技巧和注意事项,需要的朋友参考一下 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对

  • 问题内容: 我编写了一个打印表格的程序。我没有在主函数中包含返回语法,但是无论何时我键入echo $?它显示12。 我的源代码: 我尚未编写return 12,但每次执行程序时它仍返回12。 谢谢。 问题答案: 正如swegi所说,这是未定义的行为。 正如史蒂夫·杰索普(Steve Jessop)等人所说,在C89之前,它是一个未指定的值,并在C99中指定(观察到的行为与C99不符)。 在大多数环

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)

  • 我有一个内核模块(4.4.32内核),它通过将ioctl处理程序分配给< code > struct file _ operations 的< code>unlocked_ioctl指针来实现ioctl调用。一切正常,但是我得到的程序(只有二进制)是为2.6或者2.4内核编译的,如果我在4.4.32上启动这个程序,它不会让内核为我的模块注册一个对ioctl的调用。因为此程序是在旧内核上编译的,所以

  • 我正在创建一个进行线性探测以查找键索引的哈希图。如果键已经在索引中,我想增加它的值,而不是向新索引添加一个。 例如,如果我得到字符串“五,五,五”的字数,我的输出是五1,五1,五1,而不是五3。 我认为一定是我的 containsKey 方法,它使用 get 方法来检查我的密钥是否已在映射中。下面是我的Hashmap.java类。