2017-08-04 3 views
0

これはとても新しく、すべての仕組みを知るための小さなプロジェクトです。リストとモデルを使用したMVCエラー

だから私は_Layout.cshtmlファイル内のコードを配置し、私は、コードを上に壊れているViewBag.Title

に応じてどのような画像が表示制御しようとすると、各ページにヘッダー画像領域を作成するために探していますそのページの中にエラーの写真が続きます。私はちょうど問題が何であるかを理解することができません。

HomeController.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace WebSite_Project_1.Controllers 
{ 
public partial class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     ViewBag.Message = "Your application description page."; 

     return View(); 
    } 

    public ActionResult Contact() 
    { 
     ViewBag.Message = "Your contact page."; 

     return View(); 
    } 

    [ActionName("Funny-Bones")] 
    public ActionResult FunnyBones() 
    { 
     ViewBag.Message = "This is funny bones."; 

     return View(); 
    } 
    public class Headers 
    { 
     public string HeaderName { get; set; } 
     public string PageName { get; set; } 
     public int HeaderWidth { get; set; } 
     public int HeaderHeight { get; set; } 
     public string HeaderType { get; set; } 
    } 
    public ActionResult HeaderImages() 
    { 
      var model = new List<Headers>(); 

      model.Add(new Headers { HeaderName = "home", PageName = "Home Page", HeaderWidth = 2200, HeaderHeight = 1172, HeaderType = ".png" }); 
      model.Add(new Headers { HeaderName = "about", PageName = "About", HeaderWidth = 2200, HeaderHeight = 1172, HeaderType = ".png" }); 
      model.Add(new Headers { HeaderName = "contact", PageName = "Contact", HeaderWidth = 2200, HeaderHeight = 1172, HeaderType = ".png" }); 
      model.Add(new Headers { HeaderName = "funnybones", PageName = "Funny Bones", HeaderWidth = 2200, HeaderHeight = 1172, HeaderType = ".png" }); 

      return View(model); 
    } 
} 
} 

_Layout.cshtml

@model IEnumerable<WebSite_Project_1.Controllers.HomeController.Headers> 

<div class="headersImage"> 
     @foreach (var item in Model) 
     { 
      if (@item.PageName == @ViewBag.Title) 
      { 
       <img src="~/Content/Images/@[email protected]" title="@item.HeaderName" /> 
      } 
     } 
</div> 
@RenderBody() 

は、問題は、私がしようとすると起動し、それを公開してから、私は、このエラーは、foreachループでモデルを指します。

私は100%ループが正しいとは思っていませんが、まだそれを得ることはできませんでした。

Link to MVC error

+0

この使用方法ではありませんモデルのフォルダをモデルフォルダに定義し、WebSite_Project_1.Modelsの名前空間 – hasan

+0

をインポートしてListインスタンスを作成する必要があります。同じエラーを持つ他の人が検索エンジンを使用して見つけることができるように、 – Graham

+0

この行をIEnumerable に変更します。ヘッダー>を作成し、HeaderImagesビューにあなたのforeachコードを書き込んで、NullExeptionを取得しないようにしてください。 – hasan

答えて

1

あなたは決しては、レイアウトのためのモデルを指定する必要があります。渡されたモデルは常にビューの1つになります。ほとんどの場合、ではなく、はレイアウトと同じものになります。

このような場合は、子の操作を使用する必要があります。あなたが好きなビューを呼び出すことができますが、基本的にそれは希望

return PartialView("_HeaderImages", model); 

:基本的には、ちょうど、既存のHeaderImages行動を取る(直接的にルーティングされるのを防ぐ)[ChildActionOnly]属性を追加し、への復帰を変更ただ、次があります。

@model IEnumerable<WebSite_Project_1.Controllers.HomeController.Headers> 

<div class="headersImage"> 
    @foreach (var item in Model) 
    { 
     if (@item.PageName == @ViewBag.Title) 
     { 
      <img src="~/Content/Images/@[email protected]" title="@item.HeaderName" /> 
     } 
    } 
</div> 

最後に、あなたのレイアウトでは、モデルの定義行を削除して、現在そこに、ヘッダー画像のコードを置き換える:

@Html.Action("HeaderImages", "Home") 

EDIT

申し訳ありませんが、私は1つのことを逃しました。子のアクションは、メインビュー/レイアウトとは別のコンテキストでレンダリングされます(これがポイントです)。ただし、それは独自のViewBagを持っているので、メインアクションから直接ViewBagにアクセスすることはできません。 、そして、

@Html.Action("HeaderImages", "Home", new { title = ViewBag.Title }) 

このPARAMを受け入れるようにあなたの子供の行動を変更し、そのViewBagを設定します:代わりに、ルート値としてそれを渡す必要があります

[ChildActionOnly] 
public ActionResult HeaderImages(string title) 
{ 
    ... 
    ViewBag.Title = title; 
    return PartialView("_HeaderImages", model); 
} 
関連する問題