Razor보기 엔진-부분보기를 추가하는 방법


84

가능한 경우 새로운 면도기 뷰 엔진을 사용하여 부분을 렌더링하는 가장 좋은 방법이 무엇인지 궁금합니다. 나는 이것이 시간까지 완전히 끝나지 않은 것임을 이해합니다.

지금은 RenderPage를 사용하여 사용자 컨트롤을 렌더링하고 있습니다.

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

RenderPage를 호출하는 페이지는 TitleContent, HeadContent 및 Maincontent의 세 섹션이 정의 된 레이아웃 (마스터) 페이지를 사용합니다. 이 페이지에서 내 로케일 컨트롤을 렌더링하려고하면 이러한 섹션도 필요한 것으로 보입니다. 호출 페이지에서만 필요하고 존재해야합니다. 부분보기에 섹션을 포함하는지 여부에 관계없이 다음 메시지가 표시됩니다 (분명히 이러한 섹션을 포함하고 싶지는 않지만 흥미로운 디버깅 포인트처럼 보였습니다 ...).

다음 섹션이 정의되었지만 레이아웃 페이지 '~ / Views / Shared / LocaleUserControl.cshtml'에 렌더링되지 않았습니다. TitleContent; HeadContent; 메인 콘텐츠

내 부분보기는 다음과 같습니다 (다음 링크에서 수정 됨 ).

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>


<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

답변:


124

부분은 편집기 템플릿과 매우 유사하므로 다음과 같이 포함 할 수 있습니다 (물론 부분이 ~/views/controllername/EditorTemplates하위 폴더에 있다고 가정 ).

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)

또는 이것이 사실이 아니라면 간단히 :

@Html.Partial("nameOfPartial", Model)

피드백을 주셔서 감사합니다 ... Html.EditorFor는이 경우에 좋은 생각 일 수 있습니다. 그러나 이것은 더 복잡한 예제의 경우가 아니기 때문에 대안을보고 싶습니다. 곧 다시이 문제를 실행할 것입니다. Html.Partial은 ViewPage 또는 ViewUserControl에서 파생되어야하므로 작동하지 않는 반면 면도기 부분은 WebViewPage에서 파생됩니다 ...
JP.

4
Html.Partial은 완벽하게 작동합니다. Razor보기 엔진을 사용하여 Visual Studio에서 새 ASP.NET MVC 3 프로젝트를 시작 _Layout.cshtml 하고 Shared폴더 에서 파일을 열고 _LogOnPartial.cshtml어떤 파생 항목 이 포함되었는지 확인합니다 WebViewPage(Html.Partial 사용). 따라서 부분은 작동하기 위해 파생 ViewPage되거나 ViewUserControl전혀 파생 될 필요가 없습니다 Html.Partial.
Darin Dimitrov

1
흠, 맞는 것 같습니다. 또한해야 할 디버깅이있는 것 같습니다. 감사!
JP.

1
나는 Html.RenderPartialvoid를 반환하는 ASPX 페이지와 함께 사용했습니다 . Html.Partial를 반환합니다 MvcHtmlString. 따라서 부분에 많은 마크 업이 포함되어 있으면 즉시 GC에만 잠재적으로 매우 큰 문자열 객체를 생성합니다. Razor를 사용하여 출력에 직접 렌더링을 지원하는 방법이 있습니까?
Drew Noakes

2
@Draw RenderPartial을 @{...}블록 으로 래핑하는 것이 작동해야 한다고 생각 합니다. 더 나은 해결책이 있는지 알 수 없습니다.
CodesInChaos 2011 년

0

코드를 복제하고 싶지 않고 나처럼 통계를 표시하고 싶다면 뷰 모델에서 다음과 같이 데이터를 가져올 모델을 전달할 수 있습니다.

public class GameViewModel
{
    public virtual Ship Ship { get; set; }
    public virtual GamePlayer GamePlayer { get; set; }     
}

그런 다음 컨트롤러에서 각 모델에 대한 쿼리를 실행하고 뷰 모델에 전달하고 반환합니다. 예 :

GameViewModel PlayerStats = new GameViewModel();

GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();

[결과 확인 코드]

//pass current player into custom view model
PlayerStats.GamePlayer = currentPlayer;

앞서 말했듯이, 관련 테이블의 통계를 표시하려는 경우에만이 작업을 수행해야하며 다른 사람들이 위에서 언급 한 보안상의 이유로 CRUD 프로세스의 다른 부분이 발생하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.