将参数传递给 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)
但是,强类型模型更容易使用。
在 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)
但是,强类型模型更容易使用。