Получение HTML-кода частичного представления изнутри контроллера

Я разработал простой механизм для моего веб-сайта mvc для извлечения html через jquery, который затем заполняет указанный div. Все хорошо и выглядит круто. Моя проблема в том, что сейчас я создаю html-разметку внутри своего контроллера (что очень легко сделать в VB.net, кстати). Я бы предпочел не путать разделение проблем.

Можно ли использовать пользовательский элемент управления MVC View для удовлетворения этой потребности? Могу ли я создать экземпляр элемента управления, передать данные модели и выполнить рендеринг в HTML? Тогда это будет простой вопрос отрисовки и передачи обратно в вызывающий браузер.

Вы все равно не путаете разделение проблем, делая разметку HTML в своем контроллере? Если вам нужно что-то делать неоднократно, посмотрите на использование элемента управления ascx?

Matt Mitchell 17.11.2008 02:48

Разве представление не должно заботиться о создании HTML? Почему ваша разметка в вашем контроллере?

Esteban Araya 22.01.2010 20:33
2leggedspider.wordpress.com/2009/11/05/… Мне просто нужна была такая же функциональность. возвращение отрисованного частичного в моем объекте Json. Эта ссылка была для меня полезной
Bcelik 09.02.2010 00:21
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
27
3
70 422
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

В рельсах это называется отрисовкой частичного вида, и вы делаете это с помощью render :partial => 'yourfilename'. Я считаю, что ASP.NET MVC имеет аналогичный метод RenderPartial, но я не могу найти официальную документацию для MVC, чтобы подтвердить или опровергнуть такую ​​вещь.

Я искал эту проблему в Google; кажется, есть несколько методов, которые были сломаны / удалены с тех пор, как MVC перешел на бета-версию. Все еще ищу ответ

Andrew Harry 13.11.2008 06:55

После долгих поисков в Google я нашел ответ. Вы не можете получить простой доступ к HTML, выведенному представлением.

http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-to-different-output-source.aspx

Вы должны создать свое действие следующим образом:

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }

И действие вернет обработанное частичное представление в ваш ответ jquery.

Ваш jquery может выглядеть примерно так:

$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});

Вы должны использовать jquery для заполнения ваших div (и при необходимости создавать новые элементы html) и сериализацию Json для ActionResult.

Другой способ - использовать jquery для вызова некоторого контроллера / действия, но вместо этого json использует обычный View (aspx или ascx, механизм просмотра веб-форм) для рендеринга контента, а с jquery просто вставляет этот html в некоторый div. Это половина пути к UpdatePanels из asp.net ajax ...

Я бы, вероятно, выбрал первый метод, с json, где у вас немного больше работы, но он гораздо более «оптимизирован», потому что вы не передаете весь html по сети, есть просто сериализованные объекты. Так делают "большие" (gmail, g docs, hotmail, ..) - много JS-кода, который манипулирует пользовательским интерфейсом.

Если вам не нужен ajax, у вас есть два способа вызова частичных представлений:

  • html.renderpartial ("имя ascx")
  • html.RenderAction (x => x.ActionName) из Microsoft.web.mvc (фьючерсы mvc)

В первом предложенном вами методе вы имеете в виду использование частичных представлений?

Charles Prakash Dasari 06.05.2010 21:15

Нет, нет View для рендеринга контента, по крайней мере, на стороне сервера, только объект Json, который возвращается в jQuery, который затем должен выполнить рендеринг: динамически создавать Div, Spans, Tables, ... и заполнять их данными из json запрос ajax. Второй метод отображает весь HTML-код на сервере и возвращает его клиенту.

Hrvoje Hudo 12.05.2010 13:18

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

Кроме того, я также собрал Rails-подобный RJS javascript фреймворк для MVC Beta.

Проверьте это на http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc и дайте мне знать, что вы думаете.

Ответ принят как подходящий

У вас есть несколько вариантов.

Создайте пользовательский элемент управления представления MVC и обработчик действий в своем контроллере для представления. Для рендеринга вида используйте

<% Html.RenderPartial("MyControl") %>

В этом случае ваш обработчик действий должен будет передать данные модели в представление.

public ActionResult MyControl ()
{
    // get modelData

    render View (modelData);
}

Другой вариант - передать данные модели с родительской страницы. В этом случае вам не нужен обработчик действий, а тип модели такой же, как и у родительской модели:

<% Html.RenderPartial("MyControl", ViewData.Model) %>

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

В MyControl.ascx.cs:

public class MyControlViewData
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public partial class MyControl : System.Web.Mvc.ViewUserControl <MyControlViewData>
{
}

И на своей странице вы можете инициализировать модель данных вашего элемента управления:

<% Html.RenderPartial("MyControl", new MyControlViewData ()
   {
        Name= ViewData.Model.FirstName,
        Email = ViewData.Model.Email,
   });
 %>

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

Eric Schoonover 19.11.2008 08:30

Этот ответ не отвечает на заданный вопрос. Как мне получить частичный HTML-код изнутри контроллера?

Michael Lang 14.01.2010 00:21

Вы хотите захватить / изменить HTML перед отправкой его обратно в браузер?

Todd Smith 14.01.2010 23:53

Почему это принятый ответ, если он не отвечает на вопрос?

Jonathan Moffatt 03.06.2010 04:23

Это решение, которое работает с ASP.Net MVC 1.0 (многие, которые утверждают, что работают с бета-версией 3, не работают с 1.0), не страдает от проблемы «Сервер не может установить тип содержимого после отправки заголовков HTTP». и может быть вызван из контроллера (не только из представления):

/// <summary>
/// Render a view into a string. It's a hack, it may fail badly.
/// </summary>
/// <param name = "name">Name of the view, that is, its path.</param>
/// <param name = "data">Data to pass to the view, a model or something like that.</param>
/// <returns>A string with the (HTML of) view.</returns>
public static string RenderPartialToString(string controlName, object viewData) {
    ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
    viewPage.Url = GetBogusUrlHelper();

    viewPage.ViewData = new ViewDataDictionary(viewData);
    viewPage.Controls.Add(viewPage.LoadControl(controlName));

    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb)) {
        using (HtmlTextWriter tw = new HtmlTextWriter(sw)) {
            viewPage.RenderControl(tw);
        }
    }

    return sb.ToString();
}

public static UrlHelper GetBogusUrlHelper() {
  var httpContext = HttpContext.Current;

  if (httpContext == null) {
    var request = new HttpRequest("/", Config.Url.ToString(), "");
    var response = new HttpResponse(new StringWriter());
    httpContext = new HttpContext(request, response);
  }

  var httpContextBase = new HttpContextWrapper(httpContext);
  var routeData = new RouteData();
  var requestContext = new RequestContext(httpContextBase, routeData);

  return new UrlHelper(requestContext);
}

Это статический метод, который вы можете использовать в любом удобном для вас месте. Вы можете назвать это так:

string view = RenderPartialToString("~/Views/Controller/AView.ascx", someModelObject); 

Это все еще то, что часто требуется в любом крупном проекте MVC. Так что спасибо за метод

Andrew Harry 28.06.2009 04:59

Это, похоже, не работает для меня, потому что мои частичные файлы используют класс UrlHelper, вставленный в свойство Url ViewUserControl, и этот метод, похоже, оставляет это свойство равным нулю, что приводит к исключениям при вызовах моих помощников. Любой совет?

Michael Lang 14.01.2010 01:48

Майкл, может быть, некоторая информация из stackoverflow.com/questions/2031995/… может вам помочь. Я не помню, чтобы у меня были проблемы с URL-адресом, и я думаю, что использовал его.

pupeno 14.01.2010 07:40

Майкл Лэнг, вот я и починил для твоего дела.

pupeno 22.01.2010 20:30

Как отрендерить частичный вид Razor?

Peter Stegnar 03.12.2010 13:10

StringBuilder не требуется, поскольку конструктор StringWriter по умолчанию делает его внизу, а ToString созданного по умолчанию StringWriter дает вам StringBuilder ToString

jjxtra 29.01.2011 02:39

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

<% Html.RenderAction("Action", "Controller"); %>

Затем в моем фактическом отображаемом HTML у меня есть DIV, который заполняется из jQuery:

<div class = "onload">/controller/action</div>

JQuery выглядит так:

<script type = "text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>

Это сканирует все DIV, которые соответствуют классу onload, и считывает путь REST из их содержимого. Затем он выполняет jQuery.load по этому пути REST и заполняет DIV результатом.

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

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

public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}

тогда вы можете использовать JQuery для выполнения запроса, когда захотите:

$.ajax({
    type: 'GET',
    url: '/home/yourpartialviewresult',
    dataType: 'html', //be sure to use html dataType
    contentType: 'application/json; charset=utf-8',
    success: function(data){
         $(container).html(data);
    },
    complete: function(){ }
 });    

Я обнаружил, что этот однострочный код отлично работает. orderModel - мой объект модели. В моем случае у меня был вспомогательный метод, в котором мне нужно было объединить частичный вид html.

System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString();

Другие вопросы по теме