Переместить некоторый серверный код из моего представления в HtmlHelper

#asp.net #asp.net-mvc-3

#asp.net #asp.net-mvc-3

Вопрос:

На мой взгляд, у меня есть приведенное ниже утверждение:

 window.location = '@Html.Raw(Url.Action("SearchAffaires","Search", (SearchCriteriaAffaire)Session["SearchCriteriaAffaire"]))'
  

Как я могу преобразовать это с помощью помощника? Что-то вроде:

На мой взгляд:

 window.location = '@Html.NavigateSearchPage()'
  

В HtmlHelpers.cs:

     public static string NavigateSearchPage(this HtmlHelper helper)
    {
        // what do I have to code here?
    }
  

Или, может быть, есть способ получше?

Ответ №1:

Если вы хотите, чтобы сгенерированная ссылка возвращала ваш помощник HtmlString , используйте UrlHelper вместо HtmlHelper ans просто вызовите тот же метод, который вы используете в представлении:

 public static HtmlString NavigateSearchPage(this UrlHelper helper)
{
    return helper.Action("SearchAffaires","Search", 
        (SearchCriteriaAffaire)Session["SearchCriteriaAffaire"]);
}
  

Комментарии:

1. Слишком много закрывающих скобок в помощнике. Функция действия выше.

2. @Chris — Исправлено, спасибо. Я только что скопировал / вставил его из вопроса OP 🙂

3. Без проблем. Так и думал. В оригинале была функция Url.Raw вокруг нее, откуда и взялось дополнительное.

Ответ №2:

Расширение UrlHelper имело бы больше смысла в этом сценарии, чем HTML helper.

Вы могли бы сделать это следующим образом:

     public static string SearchPage(this UrlHelper helper)
    {
        return helper.Action("SearchAffaires",
               "Search", 
               (SearchCriteriaAffaire)Session["SearchCriteriaAffaire"]);
    }
  

Вид:

 window.location = '@Html.Raw(Url.SearchPage())';
  

Комментарии:

1. Отсутствует; из помощника. Действие выше.

Ответ №3:

Вот каким путем вам нужно идти.

 public static string NavigateSearchPage(this HtmlHelper helper)
{
    var urlHelper = new UrlHelper(helper.ViewContext.RequestContext)
    return helper.Raw(urlHelper.Action("SearchAffaires","Search", (SearchCriteriaAffaire)helper.ViewContext.HttpContext.Session["SearchCriteriaAffaire"])));
}