可能な場合、新しいカミソリビューエンジンを使用してパーシャルをレンダリングする最良の方法は何だろうと思いました。私はこれがその時までに完全に終わっていなかったことを理解しています
現在、RenderPageを使用してユーザーコントロールをレンダリングしています。
@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)
RenderPageを呼び出すページは、TitleContent、HeadContent、Maincontentの3つのセクションが定義されたレイアウト(マスター)ページを使用します。このページからロケールコントロールをレンダリングしようとすると、これらのセクションも必要であるように見えます。これらのセクションは呼び出しページでのみ必要であり、存在します。セクションを部分ビューに含めるかどうかに関係なく、次のメッセージが表示されます(明らかにこれらのセクションを含めたくありませんが、興味深いデバッグポイントのように思えました...)。
以下のセクションは定義されていますが、レイアウトページ '〜/ Views/Shared/LocaleUserControl.cshtml'にはレンダリングされていません。 HeadContent;メインコンテンツ
私の部分的なビューは次のとおりです(次の link から適応):
@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プロセスの他の部分は発生しません。