лучший способ поддерживать фрагменты HTML в ASP.NET MVC для возврата в вызовах AJAX - PullRequest
2 голосов
/ 23 января 2012

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

  1. вернуть только данные json, создать html на стороне клиента, используя шаблоны jquery и, возможно, jquery
  2. возвращает фактический HTML-код, созданный на стороне сервера

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

Я на самом деле ищу способ сделать # 2 с использованием частичных представлений ASP MVC и хочу иметь возможность использовать форматирование строк. по сути, я хочу позвонить так:

string sHtml = string.Format(GetNewTradeHtml(), "GOOG", "100", "635.50");

и я хочу, чтобы GetNewTradeHtml () фактически получал html из представления ASP MVC вместо строковой константы, которая может выглядеть следующим образом:

const string cNewTradeHtml = "<li><span>Symbol: {0}</span><span>Qty: {1}</span><span>Price: {2}</span></li>";

строковые константы, кажется, популярный способ делать подобные вещи, и я ненавижу поддерживать их ...

В основном я думаю, что я ищу способ управления просмотром нескольких шаблонов представления, для которых я могу вызвать ToString (), получить необработанный HTML и использовать для него форматирование строк. и я надеюсь, что есть предложенный способ решения моей конкретной проблемы в ASP MVC (без некоторого взлома). но, возможно (к сожалению) строковые константы + string.format - лучший способ поддерживать динамический HTML-код на стороне сервера ...

ОБНОВЛЕНИЕ:

вот что я узнал с тех пор, как написал этот вопрос:

здесь много сообщений о том, как отобразить представление в строку. много разных способов, некоторые работают с разными версиями MVC, некоторые нет. некоторые более чистые, чем другие, некоторые довольно тяжелые ... ВСЕ из которых, как правило, представляют собой решения, которые требуют контекста контроллера. поэтому в большинстве случаев решения прекрасно работают как ответы на запросы. но для моего случая мне нужно сделать это вне контекста контроллера, так что теперь мне нужно либо насмехаться над контроллером, либо создавать кучу поддельных объектов, с которыми я действительно не хочу иметь дело.

поэтому я определил, что на самом деле НЕТ простого способа визуализации частичного бритвы в его строковое представление без использования контроллера в ответе. им действительно нужно сделать простой способ сделать это, не копируя контекст контроллера и не запрашивая объекты.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Что такое виды в asp.net mvc?Это всего лишь шаблоны HTML, не более того.Они берут модель и заменяют шаблонные заполнители значениями модели.И действительно, нет более естественного способа визуализации html в asp.net mvc, чем использование Views.

Во-первых, объявите модель представления

public class NewTradeViewModel
{
     public string Symbol { get; set; }
     public decimal Quantity { get; set; }
     public decimal Price { get; set; }
}

, чем действие контроллера

public ViewResult GetNewTrade()
{
    NewTradeViewModel model = new NewTradeViewModel;
    model.Symbol = "GOOG";
    model.Quantity = "100";
    model.Price = 635.50m;

    // PartialView, as you want just html snippets, not full layouts with master pages, etc
    return PartialView("TemplateViewName", model);
}

и очень обычное представление - их может быть любое количество, просто измените действие контроллера, чтобы вернуть конкретное

@model NewTradeViewModel

<li><span>Symbol: @Model.Symbol</span><span>Qty: @Model.Quantity</span><span>Price: @Model.Price</span></li>
0 голосов
/ 23 января 2012

ijjo,

Просто снова посмотрел на ваш вопрос и заметил, что вы имеете в виду возвращение частичного просмотра html в виде строки.В SO есть множество ссылок на эту функцию od типа, но ниже моя версия взята из «старого» приложения mvc, которое все еще находится в производстве.без лишних слов, это метод расширения, который подключается к контроллеру:

public static class ExtensionMethods
{
    public static string RenderPartialToString(this ControllerBase controller, string partialName, object model)
    {
        var vd = new ViewDataDictionary(controller.ViewData);
        var vp = new ViewPage
        {
            ViewData = vd,
            ViewContext = new ViewContext(),
            Url = new UrlHelper(controller.ControllerContext.RequestContext)
        };

        ViewEngineResult result = ViewEngines
                                  .Engines
                                  .FindPartialView(controller.ControllerContext, partialName);

        if (result.View == null)
        {
            throw new InvalidOperationException(
            string.Format("The partial view '{0}' could not be found", partialName));
        }
        var partialPath = ((WebFormView)result.View).ViewPath;

        vp.ViewData.Model = model;

        Control control = vp.LoadControl(partialPath);
        vp.Controls.Add(control);

        var sb = new StringBuilder();

        using (var sw = new StringWriter(sb))
        {
            using (var tw = new HtmlTextWriter(sw))
            {
                vp.RenderControl(tw);
            }
        }
        return sb.ToString();
    }
}

использование (как в примере с archil выше):

public ViewResult GetNewTrade()
{
    NewTradeViewModel model = new NewTradeViewModel;
    model.Symbol = "GOOG";
    model.Quantity = "100";
    model.Price = 635.50m;

    // PartialView, as you want just html snippets, not full layouts with master pages, etc
    return this.RenderPartialToString("TemplateViewName", model);
}

удачи и наслаждайтесь ...

0 голосов
/ 23 января 2012

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

Это действительно бросок, потому что, похоже, ваши фрагменты довольно маленькие.

Если вы отправляете JSON туда и обратно, я могу порекомендовать jquery шаблоны или усы

backbone.js также может помочь вам лучше организовать компоненты на стороне клиента. С ним довольно легко начать работать. По умолчанию он работает с шаблонами jquery, но вы также можете подключить другие шаблоны, если хотите.

Вот простой подход к хранению шаблонов в отдельных файлах, http://encosia.com/using-external-templates-with-jquery-templates/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...