Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use ValueTuple as model in View?

Is it possible to use value tuples as model type in views in ASP.NET Core MVC? I mean like this:

Controller:

public IActionResult Index()
{
    ...

    (int ImportsCount, int ExportsCount) importsExports = (imports.Count, exports.Count);
    return View(importsExports);
}

View:

@model (int ImportsCount, int ExportsCount)

However, using this setup, exception is raised when page is rendered. I am using .NET 4.6.2 with System.ValueTuple NuGet package installed.

enter image description here

like image 711
Jan Palas Avatar asked May 31 '17 14:05

Jan Palas


2 Answers

By doing some testing, I found the following:

Does not work (generates hundres of view compilation errors):

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

Does work:

@model ValueTuple<string, string>
@{ var ConvertedModel = ((string x, string y)Model);

<h1>@Model.Item1 | @ConvertedModel.x </h1>
<h1>@Model.Item2 | @ConvertedModel.y </h1>

EDIT:

By looking at the GitHub issue for this (here), it seems that at Design Time Razor supports C# 7, but not at Compile/Run Time.

Update: (2+ years after the initial answer)

In .NET core 3.1 the following works perfectly for a partial view model

 @model (int Page, string Content, int PageSize, int FileLinkId)
like image 142
Camilo Terevinto Avatar answered Oct 05 '22 23:10

Camilo Terevinto


Did some experimenting after a while and I got it working with the syntax from question's text. Ie. both these options are working now:

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

That means there is no need to explicitly state ValueTuple keyword anymore.

My current set up is Visual Studio 15.8.0 and ASP.NET Core 2.1.1.

EDIT: Also works in Visual Studio 2019

like image 39
Jan Palas Avatar answered Oct 06 '22 01:10

Jan Palas