【问题标题】:Using Partial View with Data to Layout使用带数据的局部视图进行布局
【发布时间】:2017-05-01 21:36:52
【问题描述】:

我在理解局部视图的 Partial、RenderPartial 和 RenderAction 以及要包含哪些参数时遇到了一些麻烦。当我自己运行局部视图时,它可以工作。当我在具有相同@model 的 AccountHistory 中运行 RenderAction 时,它可以工作,但如果我尝试 Partial 或 RenderPartial,它会将数据返回为 null。除了AccountHistory 之外,我无法让这些在任何页面的布局中工作。我的猜测是我没有通过正确的控制器发送它。我该如何解决这个问题?

这是我的代码:

AccountHistoryVM

namespace Infotech.Coverpools.Portal.Tintaglia.Web.Models
{
    public class AccountHistoryVM
    {
        public IEnumerable<CustLedgerEntry> Records { set; get; }
        public IEnumerable<CustAcctSummary> Summary { set; get; }

        public DateTime? LastUpdatedDate { set; get; }
    }
}

CustLedgerEntry 控制器

namespace Infotech.Coverpools.Portal.Tintaglia.Web.Controllers
{
    public class CustLedgerEntryController : Controller
    {
     private TintagliaContext db = new TintagliaContext();

       public ActionResult CustAcctSummary(AccountHistoryVM AcctSum)

        {
            var dealerId = db.UserProfiles.Where(d => d.UserName.Equals(User.Identity.Name)).Select(d => d.CustomerId).FirstOrDefault();
            AcctSum = new AccountHistoryVM();
            var OpenOrders = db.CustAcctSummaries.FirstOrDefault(m => m.NoOrders != null);

            AcctSum.Summary = db.CustAcctSummaries.ToList().Where(x => x.CustomerNo_ == dealerId);

            var datetoweb = db.CustLedgerEntries.FirstOrDefault(m => m.DatetoWebSales != null);
            AcctSum.LastUpdatedDate = datetoweb.DatetoWebSales;
            return PartialView(AcctSum);
        }
    }
}

CustAcctSummary

public ActionResult CustAcctSummary(AccountHistoryVM AcctSum)

        {
            var dealerId = db.UserProfiles.Where(d => d.UserName.Equals(User.Identity.Name)).Select(d => d.CustomerId).FirstOrDefault();
            AcctSum = new AccountHistoryVM();
            var OpenOrders = db.CustAcctSummaries.FirstOrDefault(m => m.NoOrders != null);

            AcctSum.Summary = db.CustAcctSummaries.ToList().Where(x => x.CustomerNo_ == dealerId);

            var datetoweb = db.CustLedgerEntries.FirstOrDefault(m => m.DatetoWebSales != null);
            AcctSum.LastUpdatedDate = datetoweb.DatetoWebSales;
            return PartialView(AcctSum);
        }

CustAcctSummary.cshtml(部分)

@model Infotech.Coverpools.Portal.Tintaglia.Web.Models.AccountHistoryVM
<div id="AccountSummaryContainer">
    <h2>Account Summary</h2>

    <div id="AccountSummary">
       @if (Model.Summary != null)
       {
        foreach (var item in Model.Summary)
        {
            <p class="label">Open Orders </p><p class="value">@Html.DisplayFor(m => item.NoOrders)</p>
            <p class="label">Outstanding Orders </p><p class="value">@Html.DisplayFor(m => item.OutstandingOrders)</p>
            <p class="label">TOTAL BALANCE DUE </p><p class="value">@Html.DisplayFor(m => item.BalanceDue)</p>
            <p class="label">Credit Limit </p><p class="value"> @Html.DisplayFor(m => item.CreditLimit)</p>
            <p class="label">Amount Past Due </p><p class="value"> @Html.DisplayFor(m => item.Balance)</p>
        }
       }
    </div>

    <div class="updateDate">
        @Html.DisplayFor(model => model.LastUpdatedDate)
    </div>
</div>

_Layout.cshtml(各种尝试浓缩)

@{Html.RenderAction("CustAcctSummary", "CustAccountSummary");}'
//works in AccountHistory, but get the following when I try to go to a difference page (eg Home/Index): A public action method 'CustAcctSummary' was not found on controller 'Infotech.Coverpools.Portal.Tintaglia.Web.Controllers.HomeController'.

@{Html.RenderAction("CustAcctSummary", Model.Summary);}
Error   CS1973  'HtmlHelper<dynamic>' has no applicable method named 'RenderAction' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.   Infotech.Coverpools.Portal.Tintaglia.Web    F:\sites\OnlineOrder\Coverpools Dealer Portal\Infotech Coverpools Portal Tintaglia\Source\Infotech.Coverpools.Portal.Tintaglia.Web\Views\Shared\_Layout.cshtml  142 Active

@Html.Partial("CustAcctSummary");
//Returns blank Account Summary in AccountHistory: Other pages: The partial view 'CustAcctSummary' was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/CustAcctSummary.aspx
~/Views/Home/CustAcctSummary.ascx
~/Views/Shared/CustAcctSummary.aspx
~/Views/Shared/CustAcctSummary.ascx
~/Views/Home/CustAcctSummary.cshtml
~/Views/Home/CustAcctSummary.vbhtml
~/Views/Shared/CustAcctSummary.cshtml
~/Views/Shared/CustAcctSummary.vbhtml

@Html.Partial("/Views/CustLedgerEntry/CustAcctSummary");
//Returns blank Account Summary in AccountHistory: Other Pages: The partial view '/Views/CustLedgerEntry/CustAcctSummary' was not found or no view engine supports the searched locations. The following locations were searched:
/Views/CustLedgerEntry/CustAcctSummary

【问题讨论】:

    标签: asp.net-mvc-4 razor partial-views


    【解决方案1】:

    更改您的操作,例如:

        public ActionResult CustAcctSummary()
    
        {
            var AcctSum = new AccountHistoryVM();
    
            var dealerId = db.UserProfiles.Where(d => d.UserName.Equals(User.Identity.Name)).Select(d => d.CustomerId).FirstOrDefault();
    
            var OpenOrders = db.CustAcctSummaries.FirstOrDefault(m => m.NoOrders != null);
    
            AcctSum.Summary = db.CustAcctSummaries.ToList().Where(x => x.CustomerNo_ == dealerId);
    
            var datetoweb = db.CustLedgerEntries.FirstOrDefault(m => m.DatetoWebSales != null);
            AcctSum.LastUpdatedDate = datetoweb.DatetoWebSales;
            return PartialView(AcctSum);
        }
    

    然后

     @{Html.RenderAction("CustAcctSummary", "CustLedgerEntry", new { area = "" });}
    

    区域是 MVC 应用程序的一部分,不使用主控制器、动作和视图;相反,它们在项目目录中的特定子文件夹中模仿这种结构。在 Visual Studio 中,您可以通过右键单击项目文件并选择添加 -> 区域来搭建一个区域。

    area="" 表示控制器位置是主控制器文件夹(外部区域)。

    希望对你有所帮助。

    【讨论】:

    • 这两个都给我以下错误:找不到路径'/CustLedgerEntry/AccountHistory'的控制器或没有实现IController 什么是区域?
    • 您能否向您的控制器展示命名空间和操作?@Josh McGee
    • 我已经编辑了我的问题以包含控制器。抱歉,我以为我已经包含了这个。
    • 对不起我的第一个答案。我更新了我的答案。@JoshMcGee
    • 做到了。谢谢你。猜猜包含所有代码会有所帮助:-)我仍然很好奇什么是“区域”?看起来我在这里放了什么东西,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多