是否可以在View中使用ValueTuple作为模型?

时间:2017-05-31 14:23:43

标签: c# asp.net-core-mvc valuetuple

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

enter image description here

4 个答案:

答案 0 :(得分:8)

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

是否有效(生成视图编译错误):

@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问题(here),似乎在Design Time Razor支持C#7,但不支持编译/运行时。

答案 1 :(得分:3)

是的。我能够完全发挥作用。

在我的情况下,将Microsoft.CodeAnalysis.CSharp v2.2.0(以后)NuGet包添加到主项目是必要且充分的。

我的环境:

  • Visual Studio 15.3(目前是2017年最新的稳定版本)
  • .NET Core 1.1
  • LangVersion =最新
  • 以前从.NET Core 1.0 / Visual Studio 2015升级的项目
  • 没有说明设置Razor C#版本。

参考文献:

答案 2 :(得分:1)

一段时间后进行了一些实验,然后我将其与问题文本的语法一起使用。就是这两个选项现在都可以使用:

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

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

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

答案 3 :(得分: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>