Несколько PartialView в форме, дающих исключение NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта

У меня есть следующее представление, которое я разработал (используя VS 2010 ASP.NET MVC4) как своего рода панель мониторинга, которая имеет четыре разных частичных представления, которые она отображает для управления:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Manager.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
AMS Utility - Manager Home Page
</asp:Content>

<asp:Content ID="Content1" ContentPlaceHolderID="FeaturedContent" runat="server">
<section class="featured">
    <div class="content-wrapper">
        <hgroup class="title">
            <h1>AMS Utility - Property Tax Manager's Dashboard</h1>                
        </hgroup>
    </div>
</section>  
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<% Html.RenderAction("IndexTopImports"); %>
<% Html.RenderAction("IndexTopXfrReqs"); %>
<% Html.RenderAction("IndexBURequests"); %>
<% Html.RenderAction("IndexTopCompanyRequests"); %>

</asp:Content>

Вот одно из действий контроллера, связанных с RenderAction выше (все работают одинаково: (1) получить данные из DTO; (2) вернуть частичное представление с данными):

[ChildActionOnly]
public PartialViewResult IndexTopImports()
{
    ManagersDashboardDTO importDTO = new ManagersDashboardDTO();
    return PartialView("IndexTopImports", importDTO.GetImportList());
}

Вот одно из вызываемых частичных представлений (IndexTopImports.ascx). Формат для всех одинаков в том, что я передаю в представление список отображаемых данных:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<AMSUtilityMVC4.ViewModels.MgrsDashboardActiveImportsViewModel>>" %>

<h2 style="color:Green">Most Recent State Imports</h2>

<table>
    <colgroup>
        <col span="1", style="width:25%;">
        <col span="1", style="width:35%;">
        <col span="1", style="width:35%;">
    </colgroup>

    <tr>
        <th>
            State
        </th>
        <th>
            Import Date
        </th>
        <th>
            Imported By
        </th>
    </tr>

<% foreach (var item in Model) { %>    
    <tr>
        <td>
            <%: item.stateAcronym %>
        </td>
        <td>
            <%: item.importDate %>
        </td>
        <td>
            <%: item.importedBySOEID %>
        </td>
    </tr>    
<% } %>
</table>

Когда я запускаю это приложение локально, оно работает нормально, но когда я загружаю его в IIS, я получаю [NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта]. Вот трассировка стека:

[NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.] AMSUtilityMVC4.Models.MgrDashboardTopXfrRequestsDataContext..ctor () в C: \ Visual Studio Projects \ AMSUtilityMVC4 \ AMSUtilityMVC4 \ Models \ MgrDashboardTopXrdesignModels. Data_Transfer_Objects.ManagersDashboardDTO..ctor () в C: \ Visual Studio Projects \ AMSUtilityMVC4 \ AMSUtilityMVC4 \ Models \ Data Transfer Objects \ ManagersDashboardDTO.cs: 12 AMSUtilityMVC4.Controllers.ManagersController.IndexTopImports \ AMSUtility \ CMS \ CMS \ CMS \ IndexTopImports AMSUtilityMVC4 \ Controllers \ ManagersController.cs: 73 lambda_method (Closure, ControllerBase, Object []) +78 System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, параметры IDictionary2) +247 System.Web.Mvc.ControllerActionContextInvod (КонтроллерMvc.ControllerContextActionhodInvoc) controllerContext, ActionDescriptor, actionDescriptor, IDictionary2 параметры) +38 System. Web.Mvc.Async. ‹> C__DisplayClass39.b__33 () +124 System.Web.Mvc.Async.‹> C__DisplayClass4f.b__49 () +452 System.Web.Mvc.Async. ‹> C__DisplayClass37.b__36 (IAsyncResult) + 15 System.Web.Mvc.Async. ‹> C__DisplayClass2a.b__20 () +31 System.Web.Mvc.Async.‹> C__DisplayClass25.b__22 (IAsyncResult asyncResult) +230 System.Web.Mvc. ‹> C__DisplayClass1d asyncResult) +28 System.Web.Mvc.Async. ‹> c__DisplayClass4.b__3 (IAsyncResult ar) +20 System.Web.Mvc.Controller.EndExecuteCore (IAsyncResult asyncResult) +53 System.Web.playMvc.Async. b__3 (IAsyncResult ar) +20 System.Web.Mvc. ‹> c__DisplayClass8.b__3 (IAsyncResult asyncResult) +42 System.Web.Mvc.Async.‹> c__DisplayClass4.b__3 (IAsyncResult ar) +20Mv System. ‹Web > c__DisplayClass4.b__3 () +15 System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap (Func1 func) +41 System.Web.HttpServerUtility.ExecuteInternal (обработчик IHttpHandler, TextWr iter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String PhysPath, Exception error, String queryStringOverride) +1443

[HttpException (0x80004005): ошибка при выполнении дочернего запроса для обработчика System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper.] System.Web.HttpServerUtility.ExecuteInternal (IHttpHandler, обработчик виртуального пути, обработчик пути VirtualPath, средство записи пути VirtualPath, средство записи пути VirtualPath, TextWritanserve PhysPath, Exception error, String queryStringOverride) +2515 System.Web.HttpServerUtility.Execute (обработчик IHttpHandler, средство записи TextWriter, логическое значение preserveForm, логическое значение setPreviousPage) +242 System.Web.HttpServerUtilityWrapper, обработчик сценария HttpServer, обработчик текста IHttp 94 System.Web.Mvc.Html.ChildActionExtensions.ActionHelper (HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +693 System.Web.Mvc.Html.ChildActionHelperExtensions , RouteValueDictionary routeValues) + 56 ASP.views_managers_index_aspx .__ RenderContent2 (HtmlTextWriter __w, Контейнер параметров управления) в c: \ inetpub \ wwwroot \ AMSUtility \ Views \ Managers \ Index.aspx: 23 System.Web.UI.Control.RenderChildrenInternal (дочерний элемент HrittmlText) + ASP.views_shared_manager_master .__ Render__control1 (HtmlTextWriter __w, Control parameterContainer) в c: \ inetpub \ wwwroot \ AMSUtility \ Views \ Shared \ Manager.Master: 54 System.Web.UI.Control.RenderChildrenInternal (дочерние элементы HrittmlText) .Web.UI.Control.RenderChildrenInternal (средство записи HtmlTextWriter, дочерние элементы ICollection) +246 System.Web.Mvc.ViewPage.Render (средство записи HtmlTextWriter) +85 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeleanasync.

Если не считать переписывания представления, чтобы не использовать частичные представления, я не понимаю, как решить эту проблему. Есть идеи или предложения?


person CitiDeveloper    schedule 03.06.2014    source источник
comment
Ваша проблема не имеет ничего общего с Partials. Я предлагаю вам прочитать, что такое исключение нулевой ссылки и как его решить. И, похоже, вы смешиваете веб-формы и asp.net-mvc, от чего я настоятельно рекомендую.   -  person Erik Philips    schedule 03.06.2014
comment
Я разработал очень и очень мало веб-форм (почти все MVC), поэтому каким образом я смешал веб-формы и MVC, чтобы я знал, как избежать этого в будущем?   -  person CitiDeveloper    schedule 04.06.2014
comment
Любой тег, который начинается с <asp: и / или содержит runat="server", не разработан с использованием MVC (это устаревшие теги Webforms). Настоятельно рекомендую никогда их не использовать, они не нужны.   -  person Erik Philips    schedule 04.06.2014


Ответы (2)


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

Если у вас есть доступ к исходному коду для AMSUtilityMVC4.Models.MgrDashboardTopXfrRequestsDataContext, я бы посоветовал вам внимательно изучить конструктор по умолчанию, чтобы увидеть, что может вызывать исключение NullReferenceException.

Если у вас нет доступа к исходному коду, загрузите декомпилятор (скажем, Просто декомпилируйте из Telerik) и просмотрите исходный код через него.

person Rune    schedule 03.06.2014

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

Когда ваше действие контроллера выполняется впервые, возьмите все необходимые данные, затем сопоставьте данные с моделью представления ...

Итак, у вас должно получиться что-то вроде этого ...

public class ManagerDashboardViewModel
{
    public List<Import> ImportsViewModel {get;set;}
    public List<TopXfrReqs> XfrsReqsViewModel {get;set;}
    public List<BURequests> BURequestsViewModel {get;set;}
    public List<CompanyRequestsViewModel> {get;set;}
}

Затем в представлении вы можете использовать

@(this.Html.Partial("_partialView.cshtml", Model.ImportsViewModel))

Кроме того, ManagersDashboardDTO одноразовые? Если да, то где вы его выбрасываете? Если вы не выбрасываете его, это может вызвать такие же проблемы, как и у вас.

person Aydin    schedule 20.02.2016