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

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

27
задан Bhargav Rao 24 February 2019 в 07:49
поделиться

8 ответов

У Вас есть несколько опций.

Создают Пользовательский элемент управления Представления 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,
   });
 %>
2
ответ дан Todd Smith 28 November 2019 в 04:53
поделиться

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

Кроме того, я также соединил подобный Направляющим JavaScript RJS, генерирующий платформу для Беты MVC.

Проверяют его в http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc и сообщают мне то, что Вы думаете.

8
ответ дан Kevin Zink 28 November 2019 в 04:53
поделиться

Вы создали бы свое действие как это:

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

И действие возвратил бы представленное частичное представление Вашему ответу jQuery.

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

$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
7
ответ дан Christian Dalager 28 November 2019 в 04:53
поделиться

Необходимо использовать jQuery, чтобы заполнить отделения (и создать новые элементы HTML в случае необходимости), и сериализация Json для ActionResult.

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

я, вероятно, пошел бы с первым методом с json, где у Вас есть немного больше задания, чтобы сделать, но это намного более "оптимизировано", потому что Вы не передаете целый HTML по проводу, существуют только сериализованные объекты. Это - путь который "большие" (Gmail, g документы, hotmail..) делают это - партия кода JS, который управляет с UI.

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

  • html.renderpartial ("название ascx")
  • HTML. RenderAction (x => x. ActionName) от Microsoft.web.mvc (mvc фьючерсы)
5
ответ дан Hrvoje Hudo 28 November 2019 в 04:53
поделиться

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

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

4
ответ дан Andrew Harry 28 November 2019 в 04:53
поделиться

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

0
ответ дан Orion Edwards 28 November 2019 в 04:53
поделиться

Это решение, которое работает с 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); 
29
ответ дан 28 November 2019 в 04:53
поделиться

Я сделал нечто подобное для приложения, над которым я работаю. У меня есть частичные представления, возвращающие визуализированное содержимое, которые можно вызвать, используя их 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 результатом.

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

3
ответ дан 28 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: