ASP.NET Core 2.0アプリケーションでは、部分的なビューをレンダリングし、いくつかのパラメーターを渡す必要があります。
@Html.Partial("Form", new { File = "file.pdf" })
部分的なビューで、私はそれを使ってそれにアクセスしようとしました:
@Model.File
そして私はエラーを受け取ります:
RuntimeBinderException: 'object' does not contain a definition for 'File'
私が自分のパーシャルで単に使用する場合:
@Model
次のものがページに印刷されます。
{ File = file.pdf }
そのため、モデルが渡され、そこにプロパティFileがあります。
だから私は何が欠けていますか?
型なし(匿名型)データを部分ビューに渡しています。 @Model.File
は使用できません。代わりに、ViewDataのEvalメソッドを使用して値を取得する必要があります。
@ViewData.Eval("File")
従来のアプローチは、強く型付けされたViewModelクラスを作成し、それを部分ビューに渡すことです。その後、@Model.File
としてアクセスできます。
public class SampleViewModel
{
public string File { get; set; }
}
@Html.Partial("Form", new SampleViewModel { File = "file.pdf" })
パーシャルビュー内
@model SampleViewModel
<h1>@Model.File</h1>
部分ビューのモデルとしてdynamic
が必要です。これにより、匿名オブジェクトなどのすべてを渡すことができ、機能します。追加:
@model dynamic
Form.cshtmlファイルに。
あなたがするときnew { File = "file.pdf" }
、属性ファイルを含むオブジェクトを渡しています。これはobject
型なので、c#で変数に直接アクセスすることはできません。ここにあるようなオブジェクトからフィールドにアクセスするためのいくつかの醜いコードがあります: C#.NET COREカスタム属性の値を取得する方法?
ただし、この場合、(安全のために)最も推奨される方法は、クラスを作成し、そのクラスのオブジェクトを渡すことです。
したがって、次のクラスを作成するとします。
public class MyFileInfo{
public string File { get; set }
}
次に、以下を渡してオブジェクトを作成できます。
@Html.Partial("Form", new MyFileInfo{ File = "file.pdf" })
部分ビューで、最初にモデルクラスを定義します
@model MyFileInfo
次に、同じファイルでアクセスできるようになります
@Model.File