none
MVC中,想在Layout加入PartialView RRS feed

  • 問題

  • 前輩好,我想在Layout中加入PartialView

    但加入時會遇到以下錯誤訊息:

    System.Web.HttpCompileException: 'C:\Users\Hmm\AppData\Local\Temp\Temporary ASP.NET Files\vs\0f989168\a285d4ef\App_Web__account.cshtml.5f83eb8c.nzuhzhk-.0.cs(344): error CS1513: } expected'

    有參考這篇MVC System.Web.HttpCompileException on Html.RenderPartial修改過,但還是出錯。

    希望前輩能指點一下問題

    以下是我的程式碼:

    Layout頁面:

       <div class="content">
                <div class="row">
                    <div class="col-md-12">
                        @*@Html.Partial("~/Views/Account/_Account.cshtml");*@
                        @{Html.RenderPartial("~/Views/Account/_Account.cshtml"); }
                    </div>
                </div>
       </div>

    PartialView的部分

    @model CIO_II.Models.Account
    @*權限控制*@
    <div class="sidebar" id='pageItems'>
        <div class="sidebar-dropdown"><a href="#">選單</a></div>
        <ul id="nav">
            @{
                <li><a href="Default.aspx"><i class="fa fa-home"></i>首頁</a></li>
                foreach (var item in Model.PageGroupName)
                {
                    <li class="has_sub">
                        <a href='#'> <i class="fa fa-list-alt"></i>@item<span class="pull-right"><i class="fa fa-chevron-right"></i></span></a>
                        <ul>
                            @{
                                var tempGroup = @Model.Page_Info.Where(o => o.PageParentName == item);
                                foreach (var obj in tempGroup)
                                {
                                    <li data-name=@obj.PageName><a href="@obj.PageName">@obj.PageName_Show</a></li>
                                }
                            }
                        </ul>
                    </li>
                }
            }
    
        </ul>
    </div>
    


    PartialView的Controller

    namespace CIO_II.Controllers
    {
        public class AccountController : Controller
        {
            // GET: Account
    
            public ActionResult Index()
            {
                Account account = new Account();
    
                PageTableRepository pageTableRepository = new PageTableRepository();
    
                var pageInfo = pageTableRepository.GetPriv(1);
    
                var grouped = from row in pageInfo
                              group row by row.PageParentName into g
                              select new
                              {
                                  GroupKey = g.Key
                              };
    
                foreach (var item in grouped)
                {
                    account.PageGroupName.Add(item.GroupKey);
                }
    
                account.Page_Info = pageInfo;
    
                return PartialView();
            }
        }
    }

    PartialView的Model

      public class Account
        {
            public int UserID { get; set; }
            public int UnitID { get; set; }
            public int RoleID { get; set; }
            public List<string> PageGroupName { get; set; }
            public List<Page_Info> Page_Info { get; set; }
        }

    不知道我是哪裡觀念錯了,希望前輩指點一二,謝謝前輩

    2018年9月23日 上午 01:21

解答

  •   @{Html.RenderPartial("~/Views/Account/_Account.cshtml"); }

    改成 

    @Html.Action("Index", "Account")

    這樣才會進入 AccountController 的 Index Action

    ------------------------------------------------------------

    然後你的 Action 回傳的 ActionResult 應該是

    return PartialView("_Account" , account);

    ------------------------------------------------------------



    2018年9月23日 上午 02:09

所有回覆

  •   @{Html.RenderPartial("~/Views/Account/_Account.cshtml"); }

    改成 

    @Html.Action("Index", "Account")

    這樣才會進入 AccountController 的 Index Action

    ------------------------------------------------------------

    然後你的 Action 回傳的 ActionResult 應該是

    return PartialView("_Account" , account);

    ------------------------------------------------------------



    2018年9月23日 上午 02:09
  • To Coding Kid Peter Chang大大

    改成那樣會有CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'的錯誤訊息。

    看 Mrtk 大的文章似乎RenderPartial要加中括號。

    然後現在錯誤變成在 Model.PageGroupName會取不到值

    foreach (var item in Model.PageGroupName) {

    ..

    拋回:

    System.NullReferenceException: '並未將物件參考設定為物件的執行個體。'

    System.Web.Mvc.WebViewPage<TModel>.Model.get 傳回 null。

    我以為生命週期是會先經過Account的Controller之後才會到Account的View,

    在Controller設定View所需的資料就好了

    但用Debug模式看起來是先跑Account的View,所以Model.PageGroupName是null

    現在有點模糊,是要透過View去跟Controller要資料嗎

    可是這樣View會不會很亂.

    或其實是我設定錯了...

    2018年9月23日 上午 02:22
  • To Coding Kid Peter Chang大大

    改成那樣會有CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'的錯誤訊息。

    看 Mrtk 大的文章似乎RenderPartial要加中括號。

    然後現在錯誤變成在 Model.PageGroupName會取不到值

    foreach (var item in Model.PageGroupName) {

    ..

    拋回:

    System.NullReferenceException: '並未將物件參考設定為物件的執行個體。'

    System.Web.Mvc.WebViewPage<TModel>.Model.get 傳回 null。

    我以為生命週期是會先經過Account的Controller之後才會到Account的View,

    在Controller設定View所需的資料就好了

    但用Debug模式看起來是先跑Account的View,所以Model.PageGroupName是null

    現在有點模糊,是要透過View去跟Controller要資料嗎

    可是這樣View會不會很亂.

    或其實是我設定錯了...

    我後來再看看後 我剛剛修改了 原本的我的答案了 

    你應該是 Layout 讀的時候 就要進 AccountController 的 Index Action 然後會傳 Partial View 對吧!

    2018年9月23日 上午 02:32
  • 非常感謝Coding Kid Peter Chang前輩!!!

    有進入Controller而且跑出我想要的結果了

    Model的部分我有變更為:

    public class Account { public int UserID { get; set; } public int UnitID { get; set; } public int RoleID { get; set; } public List<string> PageGroupName = new List<string>();

    public List<Page_Info> Page_Info = new List<Page_Info>();

    }

    原先的寫法在Controller的

       account.PageGroupName.Add(item.GroupKey);

    會出錯。

    非常感謝前輩!

    2018年9月23日 上午 02:58