2016-02-11 3 views
2

У меня есть HtmlHelper, чтобы выплевывать html для моего названия и описания страницы.Значения в ViewBag нельзя использовать в HtmlHelper?

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?


Update

Существует красная линия ниже моей @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 не равно нулю.


Final Update

Еще несколько замечаний по решению условия.

В принципе, мы должны сделать явное приведение.

Все объекты C# имеют метод .ToString(). Но не каждый может быть брошен в строку. Значение ViewBag - это по существу объект, .ToString(), на котором нет отливки.

А почему мы должны использовать string вместо var явно объявить переменную,

строка название = string.Format ("Добро пожаловать {0}", ViewBag.Title);

Я получил хороший ответ в своем отдельном SO question.

Прямая цитата оттуда.

Все выражения оцениваются во время выполнения, с случайным исключением некоторых операций с литералами времени компиляции.

Итак: если хотя бы один из параметров является динамическим, все выражение трактуется как динамическое и оценивается во время выполнения.

Надеюсь, что это обновление поможет.

+0

Ваш 'ViewBag.Title' должен быть пустым, в противном случае' @Html .StandardHeader (ViewBag.Title.ToString()) 'должен работать. – ataravati

+0

Что происходит? Ничего не отображается или возникает ошибка? –

ответ

3

Вам необходимо указать 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) 
+0

Просто попробовал свой предложенный код. Оно работает! Благодарю. – Blaise

Смежные вопросы