2

RenderAction で奇妙な問題が発生しています。私のビューモデルは非常に複雑なので、次のように大まかにプロセスを合理化しようとします:

  1. ブラウザーがコントローラーのアクションを要求します。
  2. アクションは複雑なビュー モデルを設定し、ビューに渡します
  3. View には、子/部分ビューを構築するための renderAction が含まれています。(部分ビューが必要とするモデルの複雑さのため、この時点では、partialView の代わりに renderAction を使用します。)
  4. これは必要に応じて行われ、ビューはエラーなしでブラウザーに表示されます。
  5. 悪いデータをポストバックした後にモデル エラーを作成し、同じモデルを同じビューに返すと、renderAction が呼び出されたときにエラーがスローされます。デバッグ時にはコントローラーにアクセスしますが、アクションはスキップされ、アプリはコントローラーの下部にある破棄に直接進みます。

唯一の違いは、ビッグ ビュー モデルにデータを入力するメイン コントローラー アクション (部分アクションではない) が最初に get 経由で到達し、post 経由で到達すると失敗することです。私はモデルを何時間もいじりました - モデルをゼロから再作成したことさえありました - したがって、モデルに関連することはできません.

スタック トレースは次のとおりです。

    at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter)
   at System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, Object routeValues)
   at ASP._Page_Views_Pricelist__drawProductPricelistProductRow_cshtml.Execute() in c:\Users\Administrator\Documents\ProofPix_TFS\ProofPix\ProofPixAdmin\Views\Pricelist\_drawProductPricelistProductRow.cshtml:line 35
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
   at System.Web.Mvc.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
   at System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper htmlHelper, String partialViewName, Object model)
   at ASP._Page_Views_Pricelist_edit_cshtml.Execute() in c:\Users\Administrator\Documents\ProofPix_TFS\ProofPix\ProofPixAdmin\Views\Pricelist\Edit.cshtml:line 121
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.StartPage.RunPage()
   at System.Web.WebPages.StartPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)

renderAction は次のとおりです。

Html.RenderAction("_pricelistProductOptions", new { id = Model.Product.ProductId, ShowHtml = false });

大変お世話になりました。ところで(ちょっと初心者)!

編集 (アクションの追加)

        // POST: /Pricelist/Edit/5

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(adminEditPricelistVM adminEditPricelistVM)
    {

        if (ModelState.IsValid)
        {
            //Code removed for simplicity

            return RedirectToAction("Edit", new { id = pricelist.PricelistId });
        }

        int vendorId = (int)adminEditPricelistVM.VendorId;
        Vendor vendor = (from b in db.Vendors where b.VendorId == vendorId select b).SingleOrDefault();

        adminEditPricelistVM.ProductCategories = (from a in db.ProductCategories
                                                  from b in db.VendorProductCategory
                                                  where b.VendorId == vendorId && a.ProductCategoryId == b.ProductCategoryId
                                                  select a).OrderBy(o => o.SortOrder).ToList();

        List<Product> products = (from a in db.Products where a.DiscontinuedDate == null && a.VendorId == 1 select a).OrderBy(o => o.SortOrder).ToList();

        //repopulate ProductCategory and Vendor nav properties in the Formula items as these are no longer populated after post
        foreach(PricingFormula pf in adminEditPricelistVM.PricingFormulas){
            pf.ProductCategory = (from a in adminEditPricelistVM.ProductCategories where a.ProductCategoryId == pf.ProductCategoryId select a).SingleOrDefault();
            pf.Vendor = vendor;
        }


        adminEditPricelistVM.Pricelist.PricingFormulas = new List<PricingFormula>();
        adminEditPricelistVM.Pricelist.PricingFormulas.AddRange(adminEditPricelistVM.PricingFormulas);

        List<PricelistProduct> thisFilteredPP = (from a in adminEditPricelistVM.Pricelist.PricelistProducts where a.ProductId > 0 select a).ToList();
        List<PricelistProductOption> thisOptionsToDelete = new List<PricelistProductOption>();
        List<PricelistProductOptionsDetail> thisOptionDetailsToDelete = new List<PricelistProductOptionsDetail>();

        //filter pricelistProducts so only selected options remain in list
        foreach (PricelistProduct pp in thisFilteredPP)
        {
            pp.PricelistId = adminEditPricelistVM.Pricelist.PricelistId;
            var x = pp.ProductId;


            foreach (PricelistProductOption ppo in pp.PricelistProductOptions)
            {
                //repopulate PricelistProduct object
                ppo.PricelistProduct = pp;
                ppo.PricelistProductId = pp.PricelistProductId;

                int numPODs = (from a in ppo.PricelistProductOptionsDetails where a.ProductOptionsDetailId > 0 select a).Count();

                if (numPODs == 0)
                {
                    thisOptionsToDelete.Add(ppo);

                }
                else
                {

                    foreach (PricelistProductOptionsDetail ppod in ppo.PricelistProductOptionsDetails)
                    {
                        //repopulate  PricelistProductOption object
                        ppod.PricelistProductOption = ppo;
                        ppod.PricelistProductOptionsId = ppo.PricelistProductOptionId;

                        if (ppod.ProductOptionsDetailId == 0)
                        {
                            thisOptionDetailsToDelete.Add(ppod);
                        }
                        else //POD is selected but if it is the default option and it is the only option and it is priced at 0.00, then we will remove it to as it is the default setting.
                        {

                            if (ppod.Price == 0 && numPODs == 1)
                            {
                                ProductOptionsDetail prodOpDet = (from c in db.ProductOptionsDetails where c.ProductOptionsDetailId == ppod.ProductOptionsDetailId select c).SingleOrDefault();
                                if (prodOpDet.IsDefault == true)
                                {
                                    thisOptionsToDelete.Add(ppo);
                                }
                            }
                        }
                    }

                    foreach (PricelistProductOptionsDetail dppod in thisOptionDetailsToDelete)
                    {
                        ppo.PricelistProductOptionsDetails.Remove(dppod);
                    }
                    thisOptionDetailsToDelete.Clear();
                }
            }

            foreach (PricelistProductOption dppo in thisOptionsToDelete)
            {
                pp.PricelistProductOptions.Remove(dppo);
            }
            thisOptionsToDelete.Clear();
        }

        adminEditPricelistVM.Pricelist.PricelistProducts = new List<PricelistProduct>();
        adminEditPricelistVM.Pricelist.PricelistProducts.AddRange(thisFilteredPP);

        adminEditPricelistVM.PPPVMs =
               (from product in products
                join pricelistProduct in adminEditPricelistVM.Pricelist.PricelistProducts on product.ProductId equals pricelistProduct.ProductId into gj
                from subpricelistProduct in gj.DefaultIfEmpty()
                select new adminEditProductsPricelistProductsVM()
                {
                    CategoryId = (int)product.ProductCategoryId,
                    Product = product,
                    PricelistProduct = subpricelistProduct
                }).ToList();

        //repopulate PricelistProducts.Product and PricelistProducts.ProductCategory in Pricelist
        foreach (PricelistProduct pp in adminEditPricelistVM.Pricelist.PricelistProducts)
        {
            pp.Product = (from p in products where p.ProductId == pp.ProductId select p).SingleOrDefault();
            pp.ProductCategory = (from a in adminEditPricelistVM.ProductCategories where a.ProductCategoryId == pp.ProductCategoryId select a).SingleOrDefault();
            pp.Pricelist = adminEditPricelistVM.Pricelist;
        }

        ViewBag.PricingFormulaRoundingTypes = (from c in db.PricingFormulaRoundingTypes select c).ToList();

        var errors = ModelState.Select(x => x.Value.Errors).ToList();
        return View(adminEditPricelistVM);

    }
4

2 に答える 2

0

実際のエラーは表示されておらず、スタックトレースのみであるため、この回答は単なる空腹です。

//repopulate PricelistProducts.Product and PricelistProducts.ProductCategory in Pricelist
foreach (PricelistProduct pp in adminEditPricelistVM.Pricelist.PricelistProducts)
{
    pp.Product = (from p in products where p.ProductId == pp.ProductId select p).SingleOrDefault();

リスト内のどの製品ともPricelistProducts一致ProductIdしない が含まれているため、が null に設定されている可能性があります。productspp.Product

Model.PricelistProductswith内の各オブジェクトのアクションをレンダリングするとき

html.RenderAction("_pricelistProductOptions", new { id = Model.Product.ProductId, ShowHtml = false });

nullであるため、(おそらく) をSystem.NullReferenceException: Object reference not set to an instance of an object.呼び出すことができないため、 a をスローします。Model.Product.ProductIdModel.Product

于 2013-05-29T14:30:39.257 に答える