Asp.net mvc 如何在using语句中使用ViewBag?

Asp.net mvc 如何在using语句中使用ViewBag?,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我试图使用ViewBag在部分页面中显示窗体的操作 我尝试了以下方法: @using(Html.BeginForm(ViewBag.Action, "Person", FormMethod.Post) @using(Html.BeginForm((ViewBag.Action), "Person", FormMethod.Post) @using(Html.BeginForm(@(ViewBag.Action), "Person", FormMethod.Post) @using(Html.Be

我试图使用ViewBag在部分页面中显示窗体的操作

我尝试了以下方法:

@using(Html.BeginForm(ViewBag.Action, "Person", FormMethod.Post)
@using(Html.BeginForm((ViewBag.Action), "Person", FormMethod.Post)
@using(Html.BeginForm(@(ViewBag.Action), "Person", FormMethod.Post)
@using(Html.BeginForm({ViewBag.Action}, "Person", FormMethod.Post)
但这些都不管用。正确的语法是什么?

试试看

@using(Html.BeginForm((string)ViewBag.Action, "Person", FormMethod.Post)

请不要使用此ViewBag/ViewData,因为它们会将您的视图转换为意大利面条@微软你为什么要引入这个概念?当开发人员试图使用ASP.NET MVC v4时,请删除/禁止/抛出
BadCodeException

视图模型好得多/更安全/强类型化/避免魔术字符串/更友好地重构/只工作/…:

@using(Html.BeginForm(Model.Action, "Person", FormMethod.Post)
{

}

问题是
ViewBag
属于
dynamic
类型,因此
ViewBag.Action
也属于
dynamic
——至少编译器认为它是这样的

因此,将其转换为字符串将向编译器提供缺少的信息。如果它实际上不是字符串,则会出现运行时异常,但至少代码会正确编译:

@using(Html.BeginForm((string)ViewBag.Action, "Person", FormMethod.Post)

ViewBag
并不是模型的替代品。相反,它的意思是作为一种更方便的语法来替换
ViewData[“Property”]
@marcind,我认为ViewBag绝对没有任何用处。我的意思是好的,你写的不是
ViewData[“foo”]
而是
ViewBag.foo
,但它有着与ViewData相同的坏特性:神奇的字符串,无法重构,需要转换为正确的类型,将视图变成一团乱麻。。。不仅如此,我认为这给开发者带来了更多的困惑。请在v4中删除/弃用它。这是求救的呼声,真的:-)我看腻了。我做了很多代码审查,仍然看到很多开发人员使用
ViewData/ViewBag
。我无法用语言表达我对这些建筑的仇恨。听到这个消息我很难过。不幸的是,这个特性不太可能很快改变。它确实有用途,例如在内容页和布局页之间通信时(至少在Razor中是这样)。@marcind,你能详细说明一下ViewBag在Razor中用于内容页和布局页之间通信的用法吗,因为我从来没有在我的应用程序中真正使用过它(好的,我必须承认我用它来定义内容页的标题
ViewBag.title=“foo”
,但老实说,Razor@sections对于这个简单的场景可能非常有用)?我的意思是,ViewBag是Razor视图引擎内部使用的东西,没有它就无法工作吗?这就是我所说的场景。视图页面的内部管道不依赖于ViewData。