10

是否可以在 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。

在此处输入图像描述

4

4 回答 4

13

通过一些测试,我发现了以下内容:

不起作用(产生数百个视图编译错误):

@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>

编辑:

通过查看 GitHub 问题(此处),似乎在设计时 Razor 支持 C# 7,但在编译/运行时不支持。

更新:(最初回答后 2 年以上)

在 .NET core 3.1 中,以下内容非常适用于局部视图模型

 @model (int Page, string Content, int PageSize, int FileLinkId)
于 2017-05-31T14:36:34.910 回答
4

一段时间后做了一些实验,我得到了它与问题文本中的语法一起工作。IE。这两个选项现在都在起作用:

@model (string, string) 
@model (string x, string y)

这意味着不再需要显式声明ValueTuple关键字。

我当前的设置是 Visual Studio 15.8.0 和 ASP.NET Core 2.1.1。

编辑:也适用于 Visual Studio 2019

于 2018-10-02T06:43:52.700 回答
3

是的。我能够让它充分发挥作用。

在我的情况下,将 Microsoft.CodeAnalysis.CSharp v2.2.0(不是更高版本)NuGet 包添加到主项目是必要且足够的。

我的环境:

  • Visual Studio 15.3(目前为2017最新稳定版)
  • .NET 核心 1.1
  • 语言版本 = 最新
  • 之前从 .NET Core 1.0 / Visual Studio 2015 升级的项目
  • 没有明确设置 Razor C# 版本。

参考:

于 2017-09-04T09:50:50.850 回答
0

有趣的是,不知何故,提供的解决方案不起作用,

@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>
于 2018-04-05T16:57:22.280 回答