0

次のタイプのモデルを受け取るアクションがあります。

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# では、インターフェイスを渡し、必要に応じて適切な時点で必要な「わかっている」型にキャストできます。これは自動モデルバインディングと関係があると思われますが、確実ではなく、それを回避する方法を知りたいと思います。それ以外の場合は、モデルタイプのみを変更するコードのコピー/貼り付けが必要だと思われます.

うまくいけば、それは理にかなっています。

4

1 に答える 1

0

ビューのビューモデルが正しくありません。あなたが使用する必要があります:

@model Ui.Mvc.Models.ExchangeBookSearchViewModel

ExchangeBasicSearchViewModel は、抽象クラスとしてのみ機能する必要があります

于 2013-11-14T22:52:13.843 に答える