2015-01-12 57 views
0

問題背景:MVC中共享佈局視圖的控制器方法?

我有一個實現啓動一個MVC網站。目前每個頁面都基於一個MasterLayout視圖頁面。該主人包含一個下拉列表,該列表將與購物車中的購物車項目一起填充購物車的總貨幣價值。請在HTML注意到目前在下拉菜單中的細節是固定值:

enter image description here

什麼我後:

我試圖尋找這一點,但不能似乎找到正是答案。我希望能夠在每次加載頁面時使用購物車內容在navbar中填充dropdown。爲此,我需要一種方法來提取存儲在對象變量SESSION中的購物車項目對象。目前我的MasterLayout視圖就是這樣,它的一個視圖有沒有控制器與它關聯。

我該如何去分配某種方法到我的MasterLayout,以便我可以將購物車項目模型傳遞給視圖,每次頁面被加載後,它將被設置爲下拉菜單。

這裏的HTML:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<title></title> 
@Styles.Render("~/Content/bootstrap.css") 
@Styles.Render("~/Content/Styles.css") 
@Scripts.Render("~/bundles/modernizr")</script> 
</head> 
<body> 
<div class="navbar navbar-fixed-top"> 
    <nav class="navbar navbar-default" role="navigation" id="nav"> 
     <div class="container"> 
      <div class="navbar-header"> 
       <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> 
        <span class="sr-only">Toggle navigation</span> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
       </button> 
       <a class="navbar-brand logo">HS<b>WH</b></a> 
      </div> 
      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
       <ul class="nav navbar-nav"> 
        <li><a href="#" class="scroll-link" data-id="myCarousel">Products</a></li> 
        <li><a href="#" class="scroll-link" data-id="Welcome">About Us</a></li> 
        <li><a href="#" class="scroll-link" data-id="features">Contact</a></li> 
       </ul> 

       <form class="navbar-form pull-right"> 
        <input type="text" class="form-control" placeholder="Search this site..." id="searchInput"> 
        <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button> 
       </form> 

       <form class="navbar-form pull-right"> 
        <div class="btn-group btn-group-cart"> 
         <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 
          <span class="pull-left"><i class="fa fa-shopping-cart icon-cart"></i></span> 
          <span class="pull-left">Shopping Cart: 2 item(s)</span> 
          <span class="pull-right"><i class="fa fa-caret-down"></i></span> 
         </button> 
         <ul class="dropdown-menu cart-content" role="menu"> 
          <li> 
           <a href="detail.html"> 
            <b>Penn State College T-Shirt</b> 
            <span>x1 $528.96</span> 
           </a> 
          </li> 
          <li> 
           <a href="detail.html"> 
            <b>Live Nation ACDC Gray T-Shirt</b> 
            <span>x1 $428.96</span> 
           </a> 
          </li> 
          <li class="divider"></li> 
          <li><a href="cart.html">Total: $957.92</a></li> 
         </ul> 
        </div> 
       </form> 


      </div> 
     </div> 
    </nav> 
</div> 
@RenderBody() 
<footer> 
    <div class="container"> 
     <div class="row"> 
      <div class="col-sm-12 textAlignCenter"> 
       <h5>Copyright &copy; 2014 - Test Site</h5> 
      </div> 
     </div> 
    </div> 
</footer> 
<script> 
    $(document).ready(function() { 
     $('.dropdown-toggle').dropdown('toggle') 
    }); 
</script> 
</body> 
@Scripts.Render("~/bundles/jquery") 
@Scripts.Render("~/bundles/bootstrap") 
@RenderSection("scripts", required: false) 
</html> 
+0

我認爲最簡單的方法(像其他人所說的)是從佈局頁面(Html.Action)調用控制器動作。 –

回答

0

我可能會做到這一點使用來自主佈局調用的子操作。

@Html.Action("Cart") 
+0

感謝您的回覆。對不起,如果這聽起來很愚蠢的問題,但我仍然不確定如何在這種情況下調用方法「購物車」,當MasterLayout只是一個視圖?或者是因爲我有其他控制器是從MasterLayout繼承的視圖,我可以在任何控制器上設置方法,我希望?我有一個'CartController'類,用於在人們去結帳之前顯示購物車物品的網格視圖。我可以用這個嗎? – user1352057

+0

@ user1352057佈局只是一個視圖的容器,每個視圖要麼有自己的佈局,要麼使用主視圖。視圖僅在調用操作時呈現。如果您在每個頁面上都使用了購物車,那麼將其包含在主佈局中是有意義的,並且一個子操作(例如在購物車控制器上調用)是處理獲取該數據的合理方法。這可能是一個不同的動作,比如說「MiniCart」,它只會呈現您在標題中需要的HTML。 – tvanfosson

+0

嗨。我有一個[問題在SO](http://stackoverflow.com/questions/30273517/best-practice-for-persisting-user-state-in-special-kind-of-asp-net-mvc-applicati)。能否請你幫忙,因爲這很緊急。我真的會對你的幫助有所幫助。 –

1

在服務器端創建操作會返回PartialViewResult,它會呈現您的購物車模型。

在前端渲染你的局部通過@Html.Action("YourPartialCart",'CartController')或ajax調用。

1

所有視圖都有一個與它們相關的控制器,因爲這些視圖是繼承的。例如。當你創建一個視圖時,你將它的Layout設置爲與master.cshtml文件相同。

您的視圖有與之相關的模型。

您可以通過幾種方法解決這個問題。

最簡單的方法是使用類似HttpContext.Current.Items的東西,它是在HttpRequest期間從任何地方訪問的請求唯一的共享數據集合。

接下來會在模型上使用繼承。例如,創建類似型號本

MasterModel - > CartPageModel(繼承MasterModel) - > AccountSettingsModel(繼承MasterModel)

然後設置模型通過對MasterModel您的主頁上@Model MasterModel代碼,並且在您的視圖中它將是@Model CartPageModel。

在您的控制器中,代碼將填充基本模型MasterModel和它的鏤空類型CartPageModel上的值。

相關問題