我正在使用带有Razor引擎的ASP.NET MVC 3。我有一个包含一行的部分视图:
@Html.ActionLink(ViewData["UserNameIfLoggedIn"], "Index", "Home")
此部分视图在我的_Layout.cshtml
视图中呈现。调用控制器/动作的片段是:
@{Html.RenderAction("UserLoggedIn", "User");}
我收到编译错误,说明:
'System.Web.Mvc.HtmlHelper'不包含'ActionLink'的定义和最佳扩展方法重载'System.Web.Mvc.Html.LinkExtensions.ActionLink(System.Web.Mvc.HtmlHelper,string, string,object)'有一些无效的参数
我在另一个MVC应用程序(教程)中做了类似的调用(相同数量的参数和相同的参数数据类型),并且执行得很好。什么可能导致这?为什么现在不起作用?
我知道这可能是一个非常新秀的MVC问题,但我无法想出这个问题。
编辑:解决方案是:
@Html.ActionLink(ViewData["UserNameIfLoggedIn"].ToString(), "Index", "Home")
我只需要调用ToString()
方法将参数作为字符串。
答案 0 :(得分:4)
你需要一个字符串作为ActionLink中的第一个参数,我不确定,但我认为ViewData是一个字典。
试试这个作为测试
@Html.ActionLink("test", "Index", "Home")
如果可行,则需要遍历ViewData并获取所有单个值,并将它们作为字符串传递。不过,我不确定你的ViewData是什么。
如果您只想要一个值,请改用ViewBag。
http://brendan.enrick.com/post/Difference-Between-ViewBag-and-ViewData-in-MVC-3.aspx
答案 1 :(得分:1)
这是因为ViewData / ViewBag是一个动态的,它不知道它拥有什么类型的数据,你需要在尝试使用它之前将其拆箱到一个局部变量
@{ var foo = ViewData["Title"]; }
@Html.ActionLink(foo.ToString(), "Index", "Home")