繁体   English   中英

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

但是,使用此设置,呈现页面时会引发异常。 我正在使用 .NET 4.6.2 和 System.ValueTuple NuGet 包。

在此处输入图片说明

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

工作(生成视图编译错误的hundres):

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

是的。 我能够让它完全正常工作。

就我而言,将 Microsoft.CodeAnalysis.CSharp v2.2.0(不是更高版本)NuGet 包添加到主项目是必要且充分的。

我的环境:

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

参考资料:

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

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

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

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

编辑:也适用于 Visual Studio 2019

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM