Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
У Вас есть несколько опций.
Создают Пользовательский элемент управления Представления 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,
});
%>
Я соединил грубую платформу, которая позволяет Вам представлять представления к строке из метода контроллера в Бете MVC. Это должно помочь решить это ограничение на данный момент.
Кроме того, я также соединил подобный Направляющим JavaScript RJS, генерирующий платформу для Беты MVC.
Проверяют его в http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc и сообщают мне то, что Вы думаете.
Вы создали бы свое действие как это:
public PartialViewResult LoginForm()
{
var model = // get model data from somewhere
return PartialView(model);
}
И действие возвратил бы представленное частичное представление Вашему ответу jQuery.
Ваш jQuery мог выглядеть примерно так:
$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
Необходимо использовать jQuery, чтобы заполнить отделения (и создать новые элементы HTML в случае необходимости), и сериализация Json для ActionResult.
Другой путь состоит в том, чтобы использовать jQuery для вызова некоторого контроллера/действия, но вместо этого json для использования регулярного Представления (aspx или ascx, веб-формы просматривают механизм) для рендеринга содержания, и с jQuery просто вводят тот HTML некоторому отделению. Это - половина пути к UpdatePanels с asp.net ajax...
я, вероятно, пошел бы с первым методом с json, где у Вас есть немного больше задания, чтобы сделать, но это намного более "оптимизировано", потому что Вы не передаете целый HTML по проводу, существуют только сериализованные объекты. Это - путь который "большие" (Gmail, g документы, hotmail..) делают это - партия кода JS, который управляет с UI.
, Если Вам не нужен ajax, тогда у Вас в основном есть два способа назвать частичные представления:
После большого закапывания Google я нашел ответ. Вы не можете получить легкий доступ к HTML, произведенному представлением.
В направляющих это называют, представляя частичное представление, и Вы делаете это с render :partial => 'yourfilename'
. Я верю ASP.NET, MVC имеет подобное RenderPartial
метод, но я не могу найти, что официальные документы для MVC подтверждают или отклоняют такую вещь.
Это решение, которое работает с 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);
Я сделал нечто подобное для приложения, над которым я работаю. У меня есть частичные представления, возвращающие визуализированное содержимое, которые можно вызвать, используя их 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 результатом.
Извините, мне пора домой. Дайте мне знать, если хотите, чтобы я рассказал подробнее.