2017-12-04 2 views
0

저는 Razor보기가있는 .NET MVC 프로젝트가 있으며 드롭 다운 목록, 텍스트 상자 및 검색 버튼으로 구성된 검색 기능을 구현하고 싶습니다.RenderBody 호출 외부에 드롭 다운 목록 추가

문제는이 검색 스 니펫을 @RenderBody() 호출 내 _Layout.cshtml 파일에 구현하고 싶습니다. 즉, 모든 페이지에서 검색 기능에 액세스 할 수 있습니다 (오른쪽 상단에 위치).

저는 이것을 구현하는 좋은 방법을 찾으려고합니다. 나는 그것을 작동시킬 수는 있지만, 모든 컨트롤러와 액션에 동일한 코드 (드롭 다운 값을 가짐)를 추가해야 할 것이다.

ViewBag.States = new SelectList(db.States, "Id", "Name"); 

이것을 구현하는 더 좋은 방법이 있습니까? 이런 식으로하는 것은 매우 반복적 인 느낌입니다.

답변

3

머리글에 필요한 부분보기를 반환하는 하위 작업 메서드를 사용할 수 있으며 레이아웃에서이 동작 메서드를 호출 할 수 있습니다.

필요한 속성에 대한보기 모델을 만듭니다.

public class AllPageVm 
{ 
    public int SelectedItem { set; get; } 
    public List<SelectListItem> Items { set; get; } 
} 

이제 컨트롤러에서 작업 방법을 만듭니다. ChildActionOnly 데코레이터로이 작업 방법을 표시하십시오.

public class HomeController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult HeaderSearch() 
    { 
     var vm = new AllPageVm() 
     { 
      Items = db.States 
         .Select(a => new SelectListItem() {Value = a.Id.ToString(), 
                 Text = a.Name}) 
        .ToList() 
     }; 
     return PartialView(vm); 
    } 

이제 HeaderSearch.cshtml 부분보기에, 당신은 당신이 당신의 검색 헤더 원하는 마크 업 렌더링 할 수 있습니다. 다음은 드롭 다운을 렌더링하는 간단한 예제입니다. 당신은 당신이 원하는 마크 업을 포함하는이 부분을 업데이트 할 수 있습니다 (예는 : 텍스트 상자, 드롭 다운 메뉴 및 버튼 등이있는 폼 태그) 레이아웃에서 지금

@model AllPageVm 
<div> 
    <label>Select one state</label> 
    @Html.DropDownListFor(a => a.SelectedItem, Model.Items, "Select") 
</div> 

, 당신은이 아이 액션 메소드

<div class="container body-content"> 
    @Html.Action("HeaderSearch", "Home") 
    @RenderBody() 
    <hr/> 
    <footer> 
     <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p> 
    </footer> 
</div> 
를 호출 할 수 있습니다

View 메서드 대신 HeaderSearch 자식 작업 메서드에서 PartialView 메서드를 호출하고 있는지 확인하십시오. View 메서드를 호출하면 재귀 적으로 같은 메서드가 호출되어 StackOverflow 예외가 발생합니다.

+0

감사합니다. +1 나를 알지 못했던 새로운 개념을 소개합니다. 나는 내 컴퓨터 앞에서 바로이 솔루션을 시도 할 것이나, 처음 보면 완벽하게 이해할 수 있습니다. –