12

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

请指教..谢谢

我的 Index ActionResult 简单返回模型数据..

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

My Get Edit" ActionResult ,只是使用与 Index 相同的模型数据。

我的帖子“编辑”ActionResult,将新值分配给模型并重定向到索引页面,但索引页面不显示 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>
}
4

4 回答 4

34

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 将使用 Session 但一旦您读取记录,它将自动驱逐记录。所以它基本上用于短期的一次重定向的持久性存储。

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

于 2013-10-10T11:51:27.030 回答
2

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

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

于 2013-10-10T11:51:42.393 回答
2

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

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

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);
}
于 2013-10-10T11:52:22.523 回答
0

你也可以试试这个方法

控制器

public ActionResult Test()
    {
ViewBag.controllerValue= "testvalue";
 ..................
    }

查看- 定义剃须刀页面的顶部 @{string testvalue= (string)ViewBag.controllerValue;}

$(function () {
       var val= '@testvalue';
});
于 2017-08-24T12:04:53.937 回答