传递参数在ASP.NET核心
局部视图上的ASP.NET 2.0核心应用程序,我需要渲染的局部视图,并通过几个参数:传递参数在ASP.NET核心
@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")
传统的方法是创建一个强类型视图模型类,并把它传递给局部视图。然后你可以访问它作为@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的Dictionary中。这就是为什么我们在从ViewData的Dictionary中检索数据时需要使用'ViewData.Eval'。 – Win
你应该有dynamic
为你的部分观点,这样的模型,你可以传递一切 - 就像你匿名对象 - 和它只是工作。添加:
@model dynamic
到Form.cshtml文件。
我试过了,我仍然得到相同的错误:RuntimeBinderException:'object'不包含'File'的定义 –
然后你做错了什么,因为这是标准的做法。如果您只需要传递File属性,那么为什么不直接传递它,例如@ Html.Partial(“Form”,(object)“File.pdf”)并直接在Model中访问它? –
动态以稍微不同的方式使用。传入的对象仍然是类型对象。动态只是意味着它会在运行时评估对象的类型。在运行时,该对象仍将被视为类型对象。 –
当你做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
应该是同样的情况,在这里:https://stackoverflow.com/questions/223713/can-i-pass-an-anonymous-type-to-my-asp-net-mvc-view – DaniCE