При использовании asp.net-mvc. Каков наилучший способ обновить несколько разделов страницы с помощью одного метода HTML.Action()?

У меня есть довольно большой сайт asp.net-mvc с 100 контроллерами и тысячами действий. Раньше изображение заголовка, определенное на странице Site.Master, было жестко закодировано, и я хочу сделать его динамическим.

Для этого я добавил эту строку в свой файл Site.Master:

  <%= Html.Action("GetHeaderTitle", "Home")%>

который просто возвращает некоторый HTML для заголовка заголовка, например:

 <span style='font-size:15px;'>My Header Title</span>

Проблема в том, что <title> также имеет такое же жестко закодированное значение. Очевидно, я мог бы создать еще один HTML.Action, чтобы он отображал действительную динамику в заголовке, но теперь я дважды возвращаюсь к серверу для получения практически одной и той же информации (не точно такой же HTML, поскольку мне не нужна информация о диапазоне, а такая же логика на сервере для получения данных).

Есть ли способ, чтобы Html.Action возвращал несколько фрагментов html, которые я могу обновлять в разных местах на моей главной странице.


person leora    schedule 05.03.2016    source источник


Ответы (2)


Я думаю, вы смотрите на это неправильно - если получение заголовка является длительной операцией, просто кэшируйте результаты и все равно записывайте разные действия.

// controller
public string GetTitle()
{
    var title = (string)ControllerContext.HttpContext.Items["CachedTitle"];
    if (string.IsNullOrEmpty(title))
    {
        title = "some lengthy retrieval";
        ControllerContext.HttpContext.Items["CachedTitle"] = title;
    }
    return title;
}

public ActionResult GetTitleForTitle()
{
    return Content(GetTitle());
}

public ActionResult GetHeaderTitle()
{
    return Content("<span>"+ GetTitle() + "<span>");
}

В качестве альтернативы вы можете кэшировать его непосредственно при просмотре, что является своего рода злом (чем проще представление, тем лучше):

 <%
   ViewBag.CachedTitle = Html.Action("GetHeaderTitle", "Home");
 %>
 ...
 <%= ViewBag.CachedTitle %>
 ...
 <%= ViewBag.CachedTitle %>
person Ondrej Svejdar    schedule 09.03.2016

Вы используете <asp:ContentPlaceHolder ID="TitleContent" runat="server" /> ? в своем site.master? Или вы рассматривали возможность его использования? Это позволит вам установить заголовок из представления на основе вашей модели.

Возможно, вам также следует подумать о введении ViewModels, который позволяет вам объединять данные, связанные с представлением, в ViewModel и возвращать их из контроллера. Это позволит вам группировать запросы и экономить циклы. И используйте репозиторий данных, который вводится в ваш класс контроллера (если вы еще этого не сделали). Извините, я угадываю здесь, потому что вы не показываете код контроллера.

Или вы должны воспользоваться кодом на стороне клиента (JavaScript) и загрузить части пользовательского интерфейса через ajax? И обновить сам пользовательский интерфейс (также может быть реактивным).

К сожалению, у меня такое чувство, что сегодня вы столкнулись не с title, а скорее с hundreds of controllers with thousands of actions.

Таким образом, изучение того, как организовать контроллеры, и составление мнения на основе ваших вариантов использования было бы моим лучшим выбором, основанным на том, что я вижу и догадываюсь из вашего вопроса.

Надеюсь, это поможет...

person silverfighter    schedule 09.03.2016