ฉันจะรันโค้ดจากไฟล์เลย์เอาต์ของฉันได้อย่างไร

ฉันใช้บทช่วยสอนต่อไปนี้เพื่อช่วยฉันสร้าง RSS Reader ในแอปพลิเคชัน ASP.NET MVC3 Razor ของฉัน:

http://weblogs.asp.net/jalpeshpvadgama/archive/2011/08/17/creating-basic-rss-reader-in-asp-net-mvc-3.aspx

อย่างไรก็ตาม ไม่เหมือนกับตัวอย่างการสอน ฉันต้องการให้ฟีด RSS แสดงในทุกหน้า ดังนั้นจึงเพิ่มฟีดดังกล่าวลงในไฟล์เลย์เอาต์ของฉัน /Views/Shared/_Layout.cshtml

ขณะนี้ฉันมีมุมมองเพียง 2 ครั้งบนไซต์ของฉัน และเพื่อให้โปรแกรมอ่าน RSS ทำงานกับทั้งสองมุมมอง ฉันได้โค้ดต่อไปนี้ใน HomeController ของฉัน:

    public class HomeController : Controller
    {
        //
        // GET: /Index/

        public ActionResult Index()
        {
            return View(CT.Models.RssReader.GetRssFeed());
        }

        public ActionResult About()
        {
            return View(CT.Models.RssReader.GetRssFeed());
        }

    }

จากประสบการณ์ WebForms ของฉัน ฉันจะเพิ่มโค้ด RSS Reader ลงในโค้ดหน้าหลักของฉันที่อยู่ด้านหลัง และโค้ดจะทำงานในทุกหน้าโดยอัตโนมัติ

มีตัวควบคุมสำหรับเลย์เอาต์เพจที่ช่วยให้ฉันทำแบบเดียวกันได้หรือไม่

ฉันจะทำให้สิ่งนี้ทำงานทุกครั้งที่เรียกใช้หน้าเค้าโครงโดยไม่ต้องส่งคืนสิ่งใดได้อย่างไร


แก้ไข: ตามคำแนะนำของ @ Sebastian ตอนนี้ฉันได้เพิ่มโค้ดนี้ในมุมมองบางส่วน โดยลบ CT.Models.RssReader.GetRssFeed() ออกจาก return View() และรวมสิ่งนี้ไว้ในไฟล์เลย์เอาต์ของฉัน:

 @Html.Partial("_MyPartialView")

รหัสในมุมมองบางส่วนนี้คือ:

<ul>
    @foreach (var item in Model)
    {
      <li>
         <a href="/[email protected]" target="_blank">@item.Title</a>
      </li>
    }
</ul>

อย่างไรก็ตาม ฉันไม่ได้รับข้อผิดพลาดรันไทม์:

การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นอินสแตนซ์ของวัตถุ

เกิดข้อผิดพลาดในบรรทัด @foreach (var item in Model)


person Curt    schedule 14.03.2012    source แหล่งที่มา


คำตอบ (2)


คุณต้องสร้างมุมมองบางส่วนและเพิ่มฟังก์ชันการทำงานที่นั่น จากนั้นในเค้าโครงของคุณ แสดงผลบางส่วน

แก้ไข

มุมมองบางส่วนของคุณเป็นมุมมองบางส่วนจริงหรือ? เหตุผลที่ฉันพูดอย่างนั้นก็เพราะคุณมี "_" อยู่หน้าชื่อซึ่งบ่งบอกว่าอาจเป็นเลย์เอาต์ (อาจเป็นเพียงแบบแผนการตั้งชื่อ)

เพื่อแก้ไขข้อผิดพลาดในการอ้างอิงออบเจ็กต์ คุณต้องเพิ่ม @Model declaration ที่ด้านบนของมุมมองบางส่วน

หวังว่ามันจะช่วยได้

อัปเดต ในการใช้โมเดลที่แตกต่างกันในมุมมองบางส่วน คุณต้องประกาศอย่างชัดเจนว่าคุณกำลังจะใช้โมเดลใดในการเรนเดอร์วิธีการบางส่วน

@{Html.RenderPartial("../YourFeed", Model.YourFeedModel);}

แจ้งให้เราทราบหากวิธีนี้ช่วยแก้ปัญหาของคุณได้

person Sebastian Siek    schedule 14.03.2012
comment
ขอขอบคุณสำหรับความช่วยเหลือของคุณ แต่ตอนนี้ฉันได้รับข้อผิดพลาดอื่น โปรดดูการแก้ไขในคำถามของฉัน - person Curt; 15.03.2012
comment
อ่า นั่นเป็นเพียงการตั้งชื่อแบบแผนที่ไม่ดีของฉัน ฉันเห็นบทช่วยสอนที่ใช้ขีดล่างสำหรับมุมมองบางส่วนและคัดลอกสิ่งนั้นมา ฉันมี @model IEnumerable<CT.Models.Rss> อยู่ที่บรรทัดบนสุดของมุมมองบางส่วน แต่ฉันยังคงได้รับข้อผิดพลาดเดิม - person Curt; 15.03.2012
comment
ใช่ ขอโทษ - ความผิดของฉัน แบบแผนการตั้งชื่อของคุณถูกต้อง ฉันกำลังพยายามที่จะทำซ้ำตอนนี้และจะติดต่อกลับหาคุณเร็ว ๆ นี้ - person Sebastian Siek; 15.03.2012

ข้อผิดพลาดใหม่ที่คุณกำลังประสบอยู่เกิดจากการที่คุณไม่ส่งโมเดลไปยังมุมมองบางส่วน คุณสามารถทำได้โดยใช้อาร์กิวเมนต์ที่สองของฟังก์ชัน Html.Partial...

Html.Partial("ViewName", MyModel);

เนื่องจากฉันคิดว่าคุณกำลังพยายามทำสิ่งนี้ในหน้าเค้าโครง คุณสามารถลองใช้การอ้างอิงแบบคงที่เพื่อรับฟีด RSS ของคุณได้ ดังนั้นลืมที่จะต้องผ่านโมเดลและในบางส่วนของคุณมี:

@foreach (var item in RssRepository.GetFeed())
{
  <li>
     <a href="/[email protected]" target="_blank">@item.Title</a>
  </li>
}

นี่มันเหมือนคลาสอะไรสักอย่าง...

public static RssRepository
{
   public static MyModel GetFeed()
   {
      return new MyModel();//<- return what you would normally pass as a Model for RSS feeds
   }
}

หวังว่าทุกอย่างจะสมเหตุสมผล

person musefan    schedule 15.03.2012