部分参数同时使用ViewData字典和ViewBag会删除ViewBag数据。

3

我需要向一个部分cshtml视图传递一些信息。我使用ViewDataDictionaryViewBag来实现。

public ActionResult TaskPage(int ID = 0)
{
    ViewBag.breadcrumbs = new string[] {
        "List", "Tasks"
    };
    ViewBag.title = "Editing - My selected itemd";
    ViewBag.id = ID;
    return View();
}

当组装视图时,我也传递了一个 ViewDataDictionary

@Html.Partial("~/Views/Components/_Header.cshtml", new ViewDataDictionary { { "role", "task-page" } })

我的_Header.cshmtl文件同时使用了这个字典和ViewBag

  ViewBag.breadcrumbs = ViewBag.breadcrumbs != null ? ViewBag.breadcrumbs : new string[] { };
  var role = ViewData["role"];

令我惊讶的是,当我传递ViewDataDictionary时,ViewBag不包含任何数据。这怎么可能?有什么更好的方法来处理这个问题吗?


“已经在ViewBag中”是什么意思? ViewBag仅保留一个请求的生命周期。您不能将某些内容放入ViewBag中,发出请求,然后期望在下一个请求中仍然存在。 - Erik Funkenbusch
ViewBag 是在控制器上填充的。我添加了具体的代码以澄清。 - nest
1
看起来像这个:https://dev59.com/gG025IYBdhLWcg3w6KSO - Daniel Stackenland
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
好的。我该如何让其他观众知道他们可以在这篇帖子中找到解决方案,因为没有人发布实际答案? - nest
实际上,您可以发布一个答案。 - John Saunders
1个回答

2
请参见此帖子"ViewData"和"ViewBag"有什么区别?。看起来,“在内部,ViewBag属性以名称/值对的形式存储在ViewData字典中。” 这表明当您传递新的 ViewDataDictionary 对象时,您正在覆盖 ViewBag 。引用自这篇博客文章
public dynamic ViewBag 
{ 
    get 
    { 
         if (_dynamicViewData == null) 
        {
            _dynamicViewData = 
            new DynamicViewDataDictionary(() => ViewData); 
        }
        return _dynamicViewData;
    }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接