ViewBag中的值不能在HtmlHelper中使用?

时间:2016-02-11 21:08:59

标签: asp.net-mvc

我有一个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中得到了一个很好的答案。

从那里直接引用。

  

所有表达式都在运行时进行计算,偶尔会出现一些编译时文字操作的异常。

     

所以:如果至少有一个参数是动态的,那么整个表达式将被视为动态的并在运行时进行评估。

希望此更新有所帮助。

1 个答案:

答案 0 :(得分:5)

您需要投放ViewBag属性(因为ViewBagdynamic)。

@Html.StandardHeader((string)ViewBag.Title)

并在第二个例子中

@Html.StandardHeader((string)title)

或明确将变量声明为string而不是var

@{ string title = string.Format("Welcome {0}", ViewBag.Title); }
@Html.StandardHeader(title)