ASP.NET Core 2.0 Razor Pages에서 부분 뷰 함정

결론부터



Visual Studio에서 그렇게 신규 작성한 부분 뷰는 그대로는 사용할 수 없습니다! ! (일부 과장)
부분 뷰 측의 @page를 깎아 봅시다!

환경


  • Visual Studio Enterprise 2017 version 15.4.5
  • .NET Framework 4.7.02556
  • .NET Core 2.0

  • 재현(서): 전 준비


  • Visual Studio에서 새 프로젝트 만들기
  • Visual C#.NET CoreASP.NET Core Webアプリケーション 를 선택
  • .NET Core & ASP.NET Core 2.0 & Web アプリケーション (Razor쪽)을 선택
  • 적절한 화면에 적절하게 구현 (예에서는 Index)

  • Index.cshtml
    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
    }
    
    Title:<input asp-for="Content.Title" />
    Body:<input asp-for="Content.Body" />
    

    Index.cshtml.cs
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    
    namespace WebApplication1.Pages
    {
        public class IndexModel : PageModel
        {
            public class MyContent
            {
                public string Title { get; set; }
                public string Body { get; set; }
            }
    
            [BindProperty]
            public MyContent Content { get; set; }
    
            public void OnGet() { }
    
            public IActionResult OnPost()
            {
                if (ModelState.IsValid)
                {
                    //登録処理とか
                    return Redirect("Welcome");
                }
                return Page();
            }
        }
    }
    

    재현(파): 부분 뷰 작성


  • 바인드 한 모델마다 다른 화면에서도 사용할 수 있으므로 부분 뷰로서 잘라내기를 생각한다
  • Pages를 마우스 오른쪽 버튼으로 클릭 > 追加 > Razorページ
  • 적절한 명명으로 부분 뷰를 작성 (예에서는 _Common)



  • _Common.cshtml
    @page
    @*
        For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
    *@
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    

    재현(급): 움직이지 않는다! !


  • Index 구현을 _Common으로 이식하고 호출
  • 오류

  • Index.cshtml
    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
    }
    
    @*Title:<input asp-for="Content.Title" />
    Body:<input asp-for="Content.Body" />*@
    @Html.Partial("_Common")
    

    _Common.cshtml
    @page
    @*
        For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
    *@
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    
    @*Indexで使っていたModelClassを_Commonで使うために@model定義*@
    @model WebApplication1.Pages.IndexModel
    Title:<input asp-for="Content.Title" />
    Body:<input asp-for="Content.Body" />
    



    해결


    _Common.cshtml 의 1 행째 @page 를 깎아 봅시다.



    사이고에게



    하고 싶은 것을 보통 생각해 실행하면 움직이지 않게 된다는 것은, 곤란하네요.
    자동 생성되는 키워드가 무엇을 의미하는지 문서도 MSDN에 완전히 정비되어 있지는 않습니다.
    이 작은 팁으로 누군가를 구할 것입니다!

    좋은 웹페이지 즐겨찾기