我有一个HtmlHelper为我的页面标题和描述吐出html。
public static class HeaderHelper
{
public static MvcHtmlString StandardHeader(this HtmlHelper htmlHelper,
string title,
string description="")
{
var tbSection= new TagBuilder("div");
tbSection.AddCssClass("page-header");
var tbTitle = new TagBuilder("h2") {InnerHtml = title};
if (!string.IsNullOrEmpty(description))
{
var tbDescription = new TagBuilder("p") {InnerHtml = description};
tbSection.InnerHtml = string.Concat(tbTitle, tbDescription);
}
else
{
tbSection.InnerHtml = tbTitle.ToString();
}
return MvcHtmlString.Create(tbSection.ToString());
}
}
适用于
@Html.StandardHeader("View Employees")
和
@Html.StandardHeader("Edit Employee","...some description...")
但是当我使用像
这样的ViewBag值时@Html.StandardHeader(ViewBag.Title)
或
@Html.StandardHeader(ViewBag.Title.ToString())
所以问题是:我们如何将ViewBag.Title
传递给HtmlHelper?
我的@Html.StandardHeader(...)
声明下方有红线。
编译错误
编译器错误消息: CS1973:'System.Web.Mvc.HtmlHelper'没有名为'StandardHeader'的适用方法,但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。
我尝试了其他一些变体:
@{
var test = "test";
var title = string.Format("Welcome {0}", ViewBag.Title);
}
@Html.StandardHeader(test) // works
@Html.StandardHeader(title) // won't work :(
另外,我已确保ViewBag.Title
不为空。
对所提供的解决方案再提几点意见。
基本上,我们必须做一个明确的演员。
所有C#对象都有.ToString()
方法。但并不是每个人都可以被投射到一个字符串。 ViewBag
值本质上是一个对象,.ToString()
不是强制转换。
至于为什么我们必须使用string
代替var
来明确声明变量,
string title = string.Format(“Welcome {0}”,ViewBag.Title);
我在单独的SO question中得到了一个很好的答案。
从那里直接引用。
所有表达式都在运行时进行计算,偶尔会出现一些编译时文字操作的异常。
所以:如果至少有一个参数是动态的,那么整个表达式将被视为动态的并在运行时进行评估。
希望此更新有所帮助。
答案 0 :(得分:5)
您需要投放ViewBag
属性(因为ViewBag
是dynamic
)。
@Html.StandardHeader((string)ViewBag.Title)
并在第二个例子中
@Html.StandardHeader((string)title)
或明确将变量声明为string
而不是var
@{ string title = string.Format("Welcome {0}", ViewBag.Title); }
@Html.StandardHeader(title)