ビューから部分ビューに異なるモデルを渡そうとしています。私はそれらと2つの異なるビューモデルの両方に対して2つの別々のコントローラーアクションを持っています。しかし、ビュー内から部分ビューを呼び出すと、エラーが発生します
ディクショナリに渡されるモデルアイテムのタイプは「Application.ViewModels.Model1ViewModel」ですが、このディクショナリには「Application.ViewModels.PartialViewModel」タイプのモデルアイテムが必要です。
私はこのように呼んでいます:
@Html.Partial("_CreateUniFunctionPartial")
ビュー内のモデル呼び出しは
@model Application.ViewModels.Model1ViewModel
パーシャルビューファイルのモデルは
@model Application.ViewModels.PartialViewModel
このエラーが発生しないように、部分ビューを渡す方法がわかりません。
編集
部分図
@model Application.ViewModels.PartialViewModel
@using (Html.BeginForm("partialview", "ApplicationDetail", FormMethod.Post))
{
<div class="form-horizontal">
<h4>UniFunctionViewModel</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.detail, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.detail, new { @placeholder = "Further Information" })
@Html.ValidationMessageFor(model => model.detail)
</div>
</div>
</div>
}
あなたは正しい方法を使用しているが、正しい引数を渡していない
次のように試してみてください。
@Html.Partial("~/[path_to_root_only_if_exists]/_CreateUniFunctionPartial.cshtml", new Application.ViewModels.PartialViewModel())
モデルを渡さない場合、モデルは親から自動的に取得します。
Application.ViewModels.Model1ViewModel
必要なことの1つは、モデルを再生成するか、モデル内のプロパティを利用することです。例えば:
public class OuterViewModel
{
public InnerViewModel InnerViewModel { get; set; }
}
public class InnerViewModel
{
public string SomeProperty { get; set; }
}
トップページで、OuterViewModelを受け入れ、InnerViewModelをPartialに渡すことができます。
Outer.cshtml:
@model OuterViewModel
@Html.Partial("_InnerPartial", Model.InnerViewModel)
_InnerPartial.cshtml:
@model InnerViewModel
@using (Html.BeginForm("Inner", "Controller"))
{
<div>
@Html.AntiForgeryToken()
@Html.TextBoxFor(m => m.SomeProperty)
<input type="submit" value="Save" />
</div>
}
これは非常に簡単です。部分的なビューをレンダリングできるhtmlディレクティブがあります。コードサンプルは次のとおりです。
@Html.Partial("nameOfPartial", Model)
ここで、モデルはメインコントローラーから取得できます。
または、戻り値の型としてpartialviewresultを使用して新しいコントローラーアクションを定義し、次のようにページでレンダリングを試みることができます。
@{Html.RenderAction("Someaction", "somecontroller");}