是否可以在 View 中使用 ValueTuple 作为模型?
Is it possible to use ValueTuple as model in View?
是否可以在 ASP.NET Core MVC 的视图中使用值元组作为模型类型?我的意思是这样的:
控制器:
public IActionResult Index()
{
...
(int ImportsCount, int ExportsCount) importsExports = (imports.Count, exports.Count);
return View(importsExports);
}
查看:
@model (int ImportsCount, int ExportsCount)
但是,使用此设置,呈现页面时会引发异常。我正在使用安装了 System.ValueTuple NuGet 包的 .NET 4.6.2。
通过测试,我发现了以下内容:
不 工作吗(生成数百个视图编译错误):
@model (string, string)
@model (string x, string y)
是否有效:
@model ValueTuple<string, string>
@{ var ConvertedModel = ((string x, string y)Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
编辑:
通过查看此 (here) 的 GitHub 问题,Razor 似乎在设计时支持 C# 7,但在 Compile/Run 时不支持。
更新:(最初回答后 2 年多)
在 .NET core 3.1 中,以下内容非常适合部分视图模型
@model (int Page, string Content, int PageSize, int FileLinkId)
是的。我能够完全发挥作用。
就我而言,将 Microsoft.CodeAnalysis.CSharp v2.2.0(不晚于)NuGet 包添加到主项目是必要且充分的。
我的环境:
- Visual Studio15.3(目前最新稳定版2017)
- .NET 核心 1.1
- 语言版本 = 最新
- 之前从 .NET Core 1.0 升级的项目/Visual Studio 2015
- 没有明确设置 Razor C# 版本。
参考文献:
有趣的是,不知何故提供的解决方案不起作用,
@model ValueTuple<string, string>
@{ var ConvertedModel = ((string x, string y)Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
但以下有效:
@model ValueTuple<string, string>
@{ (string x, string y) ConvertedModel = (Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
一段时间后进行了一些试验,我使用问题文本中的语法进行了操作。 IE。这两个选项现在都有效:
@model (string, string)
@model (string x, string y)
这意味着不再需要明确声明 ValueTuple
关键字。
我当前的设置是 Visual Studio 15.8.0 和 ASP.NET Core 2.1.1。
编辑:也适用于 Visual Studio 2019
是否可以在 ASP.NET Core MVC 的视图中使用值元组作为模型类型?我的意思是这样的:
控制器:
public IActionResult Index()
{
...
(int ImportsCount, int ExportsCount) importsExports = (imports.Count, exports.Count);
return View(importsExports);
}
查看:
@model (int ImportsCount, int ExportsCount)
但是,使用此设置,呈现页面时会引发异常。我正在使用安装了 System.ValueTuple NuGet 包的 .NET 4.6.2。
通过测试,我发现了以下内容:
不 工作吗(生成数百个视图编译错误):
@model (string, string)
@model (string x, string y)
是否有效:
@model ValueTuple<string, string>
@{ var ConvertedModel = ((string x, string y)Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
编辑:
通过查看此 (here) 的 GitHub 问题,Razor 似乎在设计时支持 C# 7,但在 Compile/Run 时不支持。
更新:(最初回答后 2 年多)
在 .NET core 3.1 中,以下内容非常适合部分视图模型
@model (int Page, string Content, int PageSize, int FileLinkId)
是的。我能够完全发挥作用。
就我而言,将 Microsoft.CodeAnalysis.CSharp v2.2.0(不晚于)NuGet 包添加到主项目是必要且充分的。
我的环境:
- Visual Studio15.3(目前最新稳定版2017)
- .NET 核心 1.1
- 语言版本 = 最新
- 之前从 .NET Core 1.0 升级的项目/Visual Studio 2015
- 没有明确设置 Razor C# 版本。
参考文献:
有趣的是,不知何故提供的解决方案不起作用,
@model ValueTuple<string, string>
@{ var ConvertedModel = ((string x, string y)Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
但以下有效:
@model ValueTuple<string, string>
@{ (string x, string y) ConvertedModel = (Model);
<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>
一段时间后进行了一些试验,我使用问题文本中的语法进行了操作。 IE。这两个选项现在都有效:
@model (string, string)
@model (string x, string y)
这意味着不再需要明确声明 ValueTuple
关键字。
我当前的设置是 Visual Studio 15.8.0 和 ASP.NET Core 2.1.1。
编辑:也适用于 Visual Studio 2019