2008-11-13 3 views
27

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

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

+1

Разве вы не смешиваете разделение проблем, создавая разметку HTML в своем контроллере? Если вам нужно что-то повторить, используйте элемент управления ascx? – 2008-11-16 23:48:10

+0

Не следует ли рассматривать представление о генерации HTML? Почему ваша разметка в вашем контроллере? – 2010-01-22 17:33:31

+0

http://2leggedspider.wordpress.com/2009/11/05/serializing-a-partialview-as-json-in-asp-net-mvc/ Мне просто нужна была такая же функциональность. возвращая частичную часть в моем объекте Json. Эта ссылка была полезна для меня – Bcelik 2010-02-08 21:21:00

ответ

2

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

Создайте MVC View User Control и обработчик действий в вашем контроллере для просмотра. Оказывать вид использования

<% 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, 
    }); 
%> 
0

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

+0

Я искал эту проблему; Кажется, есть несколько методов, которые были сломаны/удалены, поскольку MVC отправился на бета-версию. Все еще охота за ответом – 2008-11-13 03:55:44

7

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

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

И действие возвратит обработанную частичный вид на ваш ответ Jquery.

Вашего JQuery может выглядеть следующим образом:

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

Вы должны использовать JQuery для заполнения вашей дивы (и создавать новый HTML элементы, если это необходимо), и JSon сериализации для ActionResult.

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

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

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

  • Html.RenderPartial ("Название ASCX")
  • html.RenderAction (х => х .ActionName) из Microsoft.web.mvc (mvc futures)
+0

В первом предложенном вами методе вы ссылаетесь на использование частичных представлений? – 2010-05-06 17:15:00

+0

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

8

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

Кроме того, я также создал Rails-структуру RJS, создающую javascript для бета-версии MVC.

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

29

Это решение, которое работает с 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); 
3

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

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

0

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

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

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

$.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(){ } 
});  
0

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

System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString(); 
Смежные вопросы