将参数传递给 ASP.NET 核心中的局部视图

Pass parameter to Partial View in 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 } 

所以模型正在传递,其中有一个 属性 文件。

那我错过了什么?

您正在将未类型化的 (匿名类型) 数据传递给部分视图。您不能使用 @Model.File。相反,您将需要使用 ViewData 的 Eval 方法来检索值。

@ViewData.Eval("File")

传统方法是创建强类型 ViewModel class,并将其传递给分部视图。然后你可以访问它作为 @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# 中访问它的任何变量。有一些丑陋的代码可以从一个对象访问一个字段,比如可以在这里找到的代码:

然而,在这种情况下,最推荐的方法(为了安全)是创建一个 class 并传递该 class 的对象。

因此,如果您创建以下 class:

public class MyFileInfo{
    public string File { get; set }
}

然后您可以通过以下方式创建您的对象:

@Html.Partial("Form", new MyFileInfo{ File = "file.pdf" })

在您的部分视图中,在开始时,定义您的模型class

@model MyFileInfo

然后在同一个文件中,您现在可以访问

@Model.File

为了完整起见:您可以通过 ViewDictionary 传递任意变量

@Html.Partial("_Partial", model, new ViewDataDictionary(ViewData) { { "MyVarName", someValue } })

然后在partial中这样访问:

ViewData["MyVarName"]

另一种选择,您可以在调用部分之前简单地设置一个 ViewData var,它将传递给它

@{
    ViewData["MyVarName"] = "hello";
}
@Html.Partial("_Partial", model)

但是,强类型模型更容易使用。