传递参数在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 } 

所以有模型被传递并且在它的属性文件。

那么我错过了什么?

+0

应该是同样的情况,在这里:https://*.com/questions/223713/can-i-pass-an-anonymous-type-to-my-asp-net-mvc-view – DaniCE

您正在向非局部视图传递非类型化的(匿名类型)数据。您不能使用@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> 
+0

是,我打算采用经典的模型方法,但不知道为什么动态方法在没有ViewData.Eval的情况下无法运行 –

+0

强类型模型存储在ViewData的模型中。相反,无类型数据存储在ViewData的Dictionary中。这就是为什么我们在从ViewData的Dictionary中检索数据时需要使用'ViewData.Eval'。 – Win

你应该有dynamic为你的部分观点,这样的模型,你可以传递一切 - 就像你匿名对象 - 和它只是工作。添加:

@model dynamic 

到Form.cshtml文件。

+0

我试过了,我仍然得到相同的错误:RuntimeBinderException:'object'不包含'File'的定义 –

+0

然后你做错了什么,因为这是标准的做法。如果您只需要传递File属性,那么为什么不直接传递它,例如@ Html.Partial(“Form”,(object)“File.pdf”)并直接在Model中访问它? –

+0

动态以稍微不同的方式使用。传入的对象仍然是类型对象。动态只是意味着它会在运行时评估对象的类型。在运行时,该对象仍将被视为类型对象。 –

当你做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