가능한 경우 새로운 면도기 뷰 엔진을 사용하여 부분을 렌더링하는 가장 좋은 방법이 무엇인지 궁금합니다. 나는 이것이 시간까지 완전히 끝나지 않은 것임을 이해합니다.
지금은 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>
답변
부분은 편집기 템플릿과 매우 유사하므로 다음과 같이 포함 할 수 있습니다 (물론 부분이 ~/views/controllername/EditorTemplates
하위 폴더에 있다고 가정 ).
@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)
또는 이것이 사실이 아니라면 간단히 :
@Html.Partial("nameOfPartial", Model)
답변
코드를 복제하고 싶지 않고 나처럼 통계를 표시하고 싶다면 뷰 모델에서 다음과 같이 데이터를 가져올 모델을 전달할 수 있습니다.
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 프로세스의 다른 부분이 발생하지 않습니다.