【问题标题】:An unhandled exception occurred while processing the request for _Partial Page处理 _Partial Page 请求时发生未处理的异常
【发布时间】:2019-03-13 20:19:43
【问题描述】:

首页级视图名为“Create.cshtml”

在该页面上,我需要放置多个 _partialViews.cshtml,这些是我使用剃须刀页面制作的:

<div>
    <row>
         <div class="col-md-6">
            @await Html.PartialAsync("~/Views/Shared/_PartialDelegates")
         </div>
         <div class="col-md-6">
            @await Html.PartialAsync("~/Views/Shared/_PartialApps")
        </div>
    </row>
</div>

现在的问题是我正在尝试使用 _PartialDelegates.cs 调用 _PartialDelegates.cshtml

_PartialDelegates.cshtml

@page
@model IMP.ECR.WEB.Views.Shared._PartialDelegatesModel
@{
}
<partial name="_PartialDelegatesView" model="Model.Avengers" />

调用_PartialDelegates.cshtml.cs

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace IMP.ECR.WEB.Views.Shared
{
    public class _PartialDelegatesModel : PageModel
    {
    public List<string> Avengers = new List<string>();      


    public void OnGet()
    {
        Avengers.AddRange(new[] { "Spiderman", "Iron Man", "Dr. Stange", "The Hulk" });
    }
    }
  }
}

然后在 _PartialDelegatesView.cshtml 我有以下内容:

@model List<string>
<div class="col-md-12">
    <h2>Avengers</h2>
    <table class="table table-boardered table-striped" style="width:100%">
        @foreach (var item in Model)
        {
            <tr>
                <td>@item</td>
            </tr>
        }
    </table>
</div>

但是,我不断收到未处理的异常 ---

 An unhandled exception occurred while processing the request.
 NullReferenceException: Object reference not set to an instance of an 
 object.
 AspNetCore.Views_Shared__PartialDelegates.get_Model()

NullReferenceException: Object reference not set to an instance of an object.
AspNetCore.Views_Shared__PartialDelegates.get_Model()
AspNetCore.Views_Shared__PartialDelegates.ExecuteAsync() in _PartialDelegates.cshtml
+
<partial name="_PartialDelegatesView" model="Model.Avengers" />
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, bool invokeViewStarts)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.RenderPartialCoreAsync(string partialViewName, object model, ViewDataDictionary viewData, TextWriter writer)
Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.PartialAsync(string partialViewName, object model, ViewDataDictionary viewData)
AspNetCore.Views_Sponsors_Create.ExecuteAsync() in Create.cshtml
+
            @await Html.PartialAsync("~/Views/Shared/_PartialDelegates.cshtml")
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, bool invokeViewStarts)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync<TFilter, TFilterAsync>()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

【问题讨论】:

    标签: c# asp.net-core razor-pages


    【解决方案1】:

    将 Razor 页面加载为部分视图似乎是不可能的,请参阅 here。 Razor 页面不能用作 View Components 的替代品。按照以下步骤创建一个 PartialDelegates ViewComponent,它可以做你想做的事情。

    1.创建ViewComponens文件夹并在文件夹中添加PartialDelegates.cs

    public class PartialDelegates:ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            List<string> Avengers = new List<string>();
            Avengers.AddRange(new[] { "Spiderman", "Iron Man", "Dr. Stange", "The Hulk" });
            return View(Avengers);
        }
    
    }
    

    2.将Default.cshtml添加到路径/Views/Shared/Components/PartialDelegates/Default.cshtml(如果文件夹不存在则创建)

    @model List<string>
    <h1>Default</h1>
    <partial name="_PartialDelegatesView" model="Model" />
    

    3.在你的Create.cshtml中,调用View Component

    @await Component.InvokeAsync("PartialDelegates")
    

    【讨论】:

      【解决方案2】:

      您需要删除_PartialDelegates.cshtml 中的@page 指令才能使局部视图正常工作。但问题是 _PartialDelegatesModel OnGet 方法永远不会被调用,因此 Avengers 列表没有被实例化。

      似乎不可能将这样的剃须刀页面用作局部视图,只有常规剃须刀视图适合此目的。如果您需要在渲染页面之前实例化一些值,那么根据docs ("Important" section)

      如果您需要执行代码,请使用view component 而不是局部视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 2021-02-20
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多