web-dev-qa-db-ja.com

ASP.NET Coreのパーシャルビューにパラメーターを渡す

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があります。

だから私は何が欠けていますか?

9
Miguel Moura

型なし(匿名型)データを部分ビューに渡しています。 @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>
16
Win

部分ビューのモデルとしてdynamicが必要です。これにより、匿名オブジェクトなどのすべてを渡すことができ、機能します。追加:

@model dynamic

Form.cshtmlファイルに。

4
Ricardo Peres

あなたがするとき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
1