2014-04-07 7 views
0

.NET MVC 4 응용 프로그램에서 레이아웃을 확장하고 싶습니다.중첩 된 레이아웃에 데이터를 전달하는 방법

_Root.cshtml

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> 
    <meta name="viewport" content="width=device-width" /> 
</head> 
<body> 
    @RenderBody() 
</body> 

_productView.cshtml

@{ 
Layout = "~/Layouts/_Root.cshtml"; 
} 

_productListView.cshtml을 : 그래서 내가 아주 간단한 방법으로 중첩 된 레이아웃을 만들었습니다

@{ 
Layout = "~/Layouts/_Root.cshtml"; 
} 

이제 데이터베이스에서 제품을 가져 와서 _productView.cshtml에서 제품 카테고리 제목을 설정하려고합니다. 예를 들어 전자 제품이라는 제목을 원한다고 말할 수 있습니다.

public ActionResult Index(string id) { 
     var product= repository.GetById(new Guid(id)); 

     if(product== null) { 
      throw new HttpException(404, "Not Found"); 
     } 

     var model = Mapper.Map<IProduct, ProductViewModel>(product); 

     return View(model); 
    } 

는 내가 뭘 원하는를 얻을 수있다

ProductController : 난 내가 데이터베이스에서 제품을 얻을 때 나는 그것의 뷰 모델을하기 전에이 작업을 수행하고 내 컨트롤러에서 뷰를 반환하려면 제품 유형을 제품에서 사용하고 _productView.cshtml에서 사용하지만 뷰백을 사용하여 수행 할 수 없다는 것을 알고 있습니다. 그럼 내가 어떻게 할 수 있니?

감사 조나단

나는 예를 확장합니다 UPDATE : 내 productView.cshtml

을에서 다음

public ActionResult Index(string id) { 
     var product= repository.GetById(new Guid(id)); 

     if(product== null) { 
      throw new HttpException(404, "Not Found"); 
     } 
        Viewbag.ProductType = product.productType; 

     var model = Mapper.Map<IProduct, productViewModel>(product); 

     return View(model); 
    } 

: 그리고 난 내 컨트롤러에서이 작업을 수행 할 경우

_productView.cshtml

@{ 
Layout = "~/Layouts/_Root.cshtml"; 
} 
@Viewbag.productType 

현재 상황에서 뷰백이 존재하지 않는다는 컴파일 오류가 발생합니다.

제품에 대한 나의 견해는 다음과 같다 : 이것은 내가 다른 방법으로 그것을 할 수 있는지, 내가 실현하려 노력하지만, 난 그 viewbag이 방법을 사용 할수 없어 읽은 내용입니다

@model producttest.product.Web.ProductViewModel 

@{ 
Layout = "~/Layouts/_productView.cshtml"; 
ViewBag.Title = @Model.Name; 

} 


<h1>@Model.Name)</h1> 
<section> 
<h2>@Model.Description, @Model.Price</h2> 
<p> 
    @Model.ImageUrl<br /> 
</p> 
</section> 

?

UPDATE 2 :

가 Viewbag 그냥 오타했다, 여기에 실제 코드 :

Compiler Error Message: CS0103: The name 'ViewBag' does not exist in the current context 

Source Error: 

Row 3:  
Row 4: } 
Row 5: @ViewBag.productType; 
+2

요구는 –

+0

@합니다. – JMK

+0

@ 데이비드 허스트 그래 미안 예를 업데이트 오타를 먹으 렴을 viewbag 반대로 그것은, ViewBag해야 ViewBag.productType – Jonathan

답변

0

그런 다음보기에서 직접 속성에 액세스 할 수 있습니다
@model MyProject.ViewModels.MyViewModel 

나는 그것을 알아낼! 중첩 된 레이아웃 구조를 사용했기 때문에 View 폴더에서 내 레이아웃을 "Layouts"라는 별도의 폴더로 옮겼습니다. 모든 "Views"폴더에는 네임 스페이스를 참조하는 Web.config가 있습니다. 레이아웃을 다른 폴더에 복사했기 때문에이 파일이 누락되었습니다.

@ JMK와 @ David Hirst 덕분에 나를 이렇게 유도했습니다!

시선 조나단

2
주의해야 할

우선은 귀하의 의견이있을 필요가 없다는 것입니다

<body> 
@RenderBody() 
</body> 

이것은 레이아웃에서만 필요합니다. @RenderBody는 View 마크 업을위한 자리 표시 자임을 기억하십시오.

보기로 전달하려는 데이터를 나타내는 POCO 인 ViewModel을 사용하려면보기를 강력하게 입력하는 것이 좋습니다. 어떤 사람들은 자신이 작업하고있는 객체를 그냥 넘겨 주며이 객체는 작동하지만 때로는 작업하는 객체와 뷰에서 표현하고자하는 객체가 다를 수 있으므로 별도의 ViewModel을 갖는 것이 더 합리적입니다.

원하는 견고한 형식의 개체를 선택하려면보기를 표시 할 수 있습니다.

@Model.MyProperty 

같은
+0

답장을 보내 주셔서 감사합니다.하지만 질문을 잘못 이해했다고 생각합니다. MVC에 익숙하지 않지만 뷰를 사용하는 방법을 알고 있습니다. 내가 무엇을 묻는 오전 어떻게 viewbag.ProductCatagory 설정할 수 있습니다 및 뷰를 렌더링하는 방법을 _productView 레이아웃에서 렌더링. 내가 이후에 viewbag와 그 일을의 결과가 나에게 컴파일 오류 som을 내 컨트롤러 (제안)에서 데이터를 취할 수 및 parrent 레이아웃에 표시 할 수있는 솔루션입니다 부탁드립니다. 그러나 한 가지 교훈은 배웠던 @renderbody입니다! 감사! – Jonathan

+0

@Jonathan 왜 당신에게 오류가 있습니까? 실제 코드를 게시 할 수 있습니까? – JMK

+0

@JMK 예제를 확장했습니다. 회신을위한 Thx! – Jonathan

관련 문제