将参数传递给ASP.NET Core中的部分视图

时间:2017-09-07 15:30:51

标签: asp.net-core asp.net-core-1.0 asp.net-core-2.0

在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 } 

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

那么我错过了什么?

3 个答案:

答案 0 :(得分:11)

您正在将无类型的(匿名类型)数据传递给部分视图。您无法使用@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>

答案 1 :(得分:4)

您应该将dynamic作为部分视图的模型,这样,您可以传递所有内容 - 比如您的匿名对象 - 并且它将正常工作。添加:

@model dynamic

到Form.cshtml文件。

答案 2 :(得分:0)

当您执行object时,您正在传递包含属性文件的对象。由于此类型为public class MyFileInfo{ public string File { get; set } } ,因此您无法直接访问c#中的任何变量。有一些丑陋的代码可以访问对象中的字段,例如可以在此处找到的字段:C# .NET CORE how to get the value of a custom attribute?

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

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

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

然后你可以传递:

来创建你的对象
@model MyFileInfo

在局部视图中,首先定义模型类

@Model.File

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

import numpy as np

mat = np.empty((10, 3))
for idx in range(10):
    mat[idx, :] = [1, 2, 3]

print(mat)