【问题标题】:Pass parameter to Partial View in ASP.NET Core将参数传递给 ASP.NET Core 中的局部视图
【发布时间】:2018-02-16 10:03:48
【问题描述】:

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

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

那么我错过了什么?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 是的,我会选择经典的模型方法,虽然不确定为什么没有 ViewData.Eval 动态方法不起作用
  • 强类型模型存储在 ViewData 的模型中。相反,无类型数据存储在 ViewData 的字典中。这就是为什么我们在从 ViewData 的 Dictionary 中检索数据时需要使用ViewData.Eval
【解决方案2】:

您应该将dynamic 作为局部视图的模型,这样,您可以传递所有内容 - 就像您的匿名对象一样 - 它会正常工作。添加:

@model dynamic

到 Form.cshtml 文件。

【讨论】:

  • 我试过了,我仍然得到同样的错误:RuntimeBinderException: 'object' does not contain a definition for 'File'
  • 那么你做错了什么,因为这是标准的做法。如果只需要传递 File 属性,为什么不直接传递,例如 @Html.Partial("Form", (object)"File.pdf") 并在 Model 中直接访问?
  • dynamic 的使用方式略有不同。传入的对象仍然是对象类型。动态只是意味着它将在运行时评估对象的类型。在运行时,该对象仍将被视为类型对象。
  • 这不是真的。如果您传递一个匿名对象,它将是一个匿名对象,并且通过将其包装在动态中,您将能够访问其属性。 VS 模板创建的视图使用 dynamic 只是为了这个目的。
【解决方案3】:

当您执行new { File = "file.pdf" } 时,您传递的是一个包含属性文件的对象。由于这是object 类型,因此您不能直接在c# 中访问它的任何变量。有一些丑陋的代码可以从对象中访问字段,例如可以在此处找到的代码:C# .NET CORE how to get the value of a custom attribute?

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

所以如果你创建以下类:

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

然后你可以通过传递来创建你的对象:

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

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

@model MyFileInfo

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

@Model.File

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 2011-09-26
    • 2022-10-01
    • 2010-12-26
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多