2012-07-12 44 views
10

Tôi đang làm việc để thiết lập nội dung được chia sẻ (điều hướng) cho trang bố cục asp.net MVC.ASP.NET MVC 3 Xem một phần trong trang bố cục

Đây là chế độ xem một phần của tôi "_LayoutPartial.cshtml" với mã để kéo dữ liệu điều hướng từ một mô hình.

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     //Test dump of navigation data 
     @Html.Encode(item.Name); 
     @Html.Encode(item.URL); 

    } 
</p> 

Đây là cách mã cho trình điều khiển của tôi "LayoutController.cs" trông như thế nào.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyApp.Models.ViewModel; 

namespace MyApp.Controllers 
{ 
    public class LayoutController : Controller 
    { 

     // 
     // GET: /Layout/ 

     LayoutViewModel layout = new LayoutViewModel(); 

     public ActionResult Index() 
     { 
      return View(layout); 
     } 

    } 
} 

Đây là mã cho trang "_Layout.cshtml". Tôi đang cố gắng gọi một phần xem ở đây bằng cách sử dụng phương thức Html.RenderAction (Hành động, Bộ điều khiển).

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <p> 
     @{Html.RenderAction("Index","Layout");} 
    </p> 

    @RenderBody() 
</body> 
</html> 

Khi trang bố trí thực hiện các @ {Html.RenderAction ("Index", "Giao diện");} dòng, nó ném ra một thông báo lỗi "Lỗi thực thi yêu cầu đứa trẻ cho trình xử lý 'System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '. "

Tôi thiếu bạn bè là gì? Làm thế nào tôi có thể gọi một phần xem trong một trang bố trí?

Cảm ơn tất cả mọi người trước!

+0

đâu xem một phần của bạn nằm –

+0

~/Views/Shared/_LayoutPartial.cshtml – Felasfaw

Trả lời

16

Thay vì:

public ActionResult Index() 
{ 
    return View(layout); 
} 

làm:

public ActionResult Index() 
{ 
    return PartialView(layout); 
} 

Nếu bạn không làm điều đó khi bạn quay trở lại một cái nhìn bình thường từ hành động con quý vị, xem bình thường này cố gắng để bao gồm các Layout, mà lần lượt cố gắng trả lại hành động con, lần lượt trả về một lượt xem, lần lượt bao gồm Bố cục, lần lượt cố gắng hiển thị hành động con, ... và chúng tôi kết thúc với các tên giống như tên được chuyển bởi cùng một trang web.

Cũng trong phần của bạn, bạn không cần phải thực hiện mã hóa kép. Chức năng @ Razor đã làm HTML mã hóa:

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     @item.Name 
     @item.URL 
    } 
</p> 
+1

Ném "Đối tượng tham chiếu không được đặt để một thể hiện của một đối tượng." tại dòng @foreach trong tệp xem một phần. Có vẻ như đối tượng navHeader không có mục nào. – Felasfaw

+1

Bạn cũng có thể viết '@ Html.Action (" Index, "Layout") 'thay vì' @ {Html.RenderAction ("Index", "Layout");} 'mặc dù tôi không biết cái nào nhanh hơn. –

6

Đầu tiên xác minh rằng quan điểm con bạn nằm bên trong thư mục Shared

@Html.Partial("_LayoutPartial") 

HOẶC

@{Html.RenderAction("actionname", "controller name");} 

Và đừng sử dụng @Html.Encode(), Razor đã làm cho u. Chỉ cần sử dụng

@item.Name 
@item.URL 
+0

Html.Partial đầu tiên ném "Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng" Lỗi. Đề xuất thứ hai ném thông báo lỗi mà tôi đã đăng trong bài đăng đầu tiên của mình – Felasfaw

+0

Vị trí nhìn một phần của bạn nằm ở đâu, ý tôi là –

+0

Có chế độ xem một phần nằm bên trong thư mục chia sẻ – Felasfaw

2

tôi đã giải quyết lỗi này nhận được trên trang Layout

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper 

quan trọng! Đầu tiên tạo xem phần bên trong thư mục chia sẻ

Trong Controller,

public PartialViewResult Userdetails() 
{ 
    .... 
    return PartialView("PartialViewName", obj); 
} 

Trong bố cục trang,

@{Html.RenderAction("action","controller");} 
+0

Awesome !!! ! Tuyệt quá!! –

0

Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ tôi sẽ ném này tại đây. Bạn có thể sử dụng Html.Action hoặc Html.RenderAction. Cả hai đều về mặt kỹ thuật làm điều tương tự nhưng tùy thuộc vào lượng nội dung bạn đang quay lại có thể ảnh hưởng đến việc bạn nên sử dụng hiệu quả nào nhất cho hiệu quả tốt nhất.

Cả hai phương pháp đều cho phép bạn gọi vào một phương thức hành động từ chế độ xem và xuất kết quả của hành động vào vị trí trong chế độ xem. Sự khác biệt giữa hai là Html.RenderAction sẽ hiển thị kết quả trực tiếp đến Phản hồi (hiệu quả hơn nếu hành động trả về một lượng lớn HTML) trong khi Html.Action trả về một chuỗi có kết quả.

Source

Các vấn đề liên quan