次のタイプのモデルを受け取るアクションがあります。
ExchangeBooksSearchViewModel : ExchangeBasicSearchViewModel
そのため、ポストバックすると、そのモデルに著者などに関する情報があります。そのため、それをビューに渡します。
public ActionResult Books(ExchangeBooksSearchViewModel searchModel, int? page)
{
..
return View("Index", searchModel);
}
..
@model Ui.Mvc.Models.ExchangeBasicSearchViewModel
@{
ViewBag.Title = metaExchange.Index_PageTitle;
ViewBag.ActionName = "Index";
}
@section InlineTitle {<h2>@metaExchange.Index_InlineTitle</h2>
}
@section SearchArea { @Html.Partial("_ItemsSearch_ManagerPartial", Model)}
@Html.Partial("_ItemsList_AjaxPartial", Model)
@section HiddenPostFields { }
@section scripts{}
次に、_ItemsSearch_ManagerPartial 内でアクションを呼び出して、モデルに適した検索 Ui を表示します。
<div id="AdvancedCategorySearch">
@Html.Action("NonAjaxPostbackCategorySearchDisplay", Model)
</div>
..
[AllowAnonymous]
public ActionResult NonAjaxPostbackCategorySearchDisplay(ExchangeBasicSearchViewModel searchModel)
{
if (searchModel.CategoryAction == "Books")
{
return PartialView("_ItemsSearch_Books", new ExchangeBooksSearchViewModel());
}
if (searchModel.CategoryAction == "Computers")
{
return PartialView("_ItemsSearch_Computers", new ExchangeComputersSearchViewModel());
}
return PartialView("_ItemsSearch_Basic", new ExchangeBasicSearchViewModel());
}
問題は、私が到達するまでに
NonAjaxPostbackCategorySearchDisplay(ExchangeBasicSearchViewModel searchModel)
キャストしようとしても、基本型 ExchangeBasicSearchViewModel しか使用できません::
ExchangeBasicSearchViewModel as ExchangeBooksSearchViewModel
私はヌルになります。これはわかりません。ビューのモデル タイプが
@model Ui.Mvc.Models.ExchangeBasicSearchViewModel
ポイントは、サブタイプがビューのジェネリック関数に渡されることを許可することですが、これはすべてサーバー上でまだ発生しているため、サブタイプがベースタイプに取り除かれた場所がわかりませんか?
「通常の」c# では、インターフェイスを渡し、必要に応じて適切な時点で必要な「わかっている」型にキャストできます。これは自動モデルバインディングと関係があると思われますが、確実ではなく、それを回避する方法を知りたいと思います。それ以外の場合は、モデルタイプのみを変更するコードのコピー/貼り付けが必要だと思われます.
うまくいけば、それは理にかなっています。