C# 是否可以在不创建viewmodel的情况下返回模型和字符串?

C# 是否可以在不创建viewmodel的情况下返回模型和字符串?,c#,asp.net-core,C#,Asp.net Core,我想实现这样的目标: public IActionResult Test(string id) { (...) var user = context.Users.First(x => x.Id.ToString() == id); var message = "abc"; return View("Edit", user, message); } 不创建ViewModel就可以吗?尝试使用匿名对象: public IActionResult Test(

我想实现这样的目标:

public IActionResult Test(string id)
{
    (...)

    var user = context.Users.First(x => x.Id.ToString() == id);
    var message = "abc";

    return View("Edit", user, message);
}

不创建ViewModel就可以吗?

尝试使用匿名对象:

public IActionResult Test(string id)
{
    (...)

    var user = context.Users.First(x => x.Id.ToString() == id);
    var message = "abc";

    return View("Edit", new {User = user, Message = message});
}

尝试使用匿名对象:

public IActionResult Test(string id)
{
    (...)

    var user = context.Users.First(x => x.Id.ToString() == id);
    var message = "abc";

    return View("Edit", new {User = user, Message = message});
}

我完全同意关于尽可能使用视图模型的建议。他们更容易合作,即使有时看起来有些过分

也就是说,要回答您的问题,您可以使用一个
元组来:

public IActionResult Test(string id)
{
    var user = context.Users.First(x => x.Id.ToString() == id);
    var message = "abc";

    // The generic types will be inferred here so they're not necessary
    // but I've added them for clarity in the example.
    var viewModel = Tuple.Create<User, string>(user, message);

    return View("Edit", viewModel);
}
如果您使用的是.NET Core 2.1及以上版本,则视图的
model
指令变为:

@model (User user, string message)
然后,您可以访问如下内容:

@Model.user
否则,您需要使用(注释中的@AdamSimon):

@model ValueTuple
var(用户、消息)=模型;

有关更多信息,请参阅MSDN上的博文。

我完全同意关于尽可能使用视图模型的建议。他们更容易合作,即使有时看起来有些过分

也就是说,要回答您的问题,您可以使用一个
元组来:

public IActionResult Test(string id)
{
    var user = context.Users.First(x => x.Id.ToString() == id);
    var message = "abc";

    // The generic types will be inferred here so they're not necessary
    // but I've added them for clarity in the example.
    var viewModel = Tuple.Create<User, string>(user, message);

    return View("Edit", viewModel);
}
如果您使用的是.NET Core 2.1及以上版本,则视图的
model
指令变为:

@model (User user, string message)
然后,您可以访问如下内容:

@Model.user
否则,您需要使用(注释中的@AdamSimon):

@model ValueTuple
var(用户、消息)=模型;

有关更多信息,请参阅MSDN上的博文。

您可以使用ViewBag,但请注意其内容不是强类型的

控制器

public IActionResult Test(string id)
{
    (...)

    ViewBag.User = context.Users.First(x => x.Id.ToString() == id);
    ViewBag.Message = "abc";

    return View("Edit");
}
查看

@{
    User user = ViewBag.User as User; 
    string message = ViewBag.Message as string;
}

您可以使用ViewBag,但请注意其内容不是强类型的

控制器

public IActionResult Test(string id)
{
    (...)

    ViewBag.User = context.Users.First(x => x.Id.ToString() == id);
    ViewBag.Message = "abc";

    return View("Edit");
}
查看

@{
    User user = ViewBag.User as User; 
    string message = ViewBag.Message as string;
}

添加一个附加字符串字段时,可以使用ViewBag

public IActionResult Test(string id)
{
    (...)

    var user = context.Users.First(x => x.Id.ToString() == id);
    ViewBag.message = "abc";

    return View("Edit", user);
}

我同意其他人的看法,如果viewmodel变得更加复杂,它将节省时间。

添加一个额外的字符串字段时,可以使用ViewBag

public IActionResult Test(string id)
{
    (...)

    var user = context.Users.First(x => x.Id.ToString() == id);
    ViewBag.message = "abc";

    return View("Edit", user);
}

我同意其他人的看法,如果视图模型变得更加复杂,那么它将节省时间。

匿名对象将无法真正工作,因为您必须在视图中使用反射来访问其属性

您的选择:

  • 元组

    • 操作:
      返回视图(“编辑”,Tuple.Create(用户,消息))
    • 视图:

      @model Tuple<User, string>
      // accessing model data:
      @{ 
         var user = Model.Item1;
         var message = Model.Item2; 
      }
      
      // accessing model data:
      @{
          var user = (User)ViewData["user"]; // or: User user = ViewBag.user;
          var message = (string)ViewData["message "]; // or: string message = ViewBag.message ;
      }
      
  • 视图包/视图数据

    • 行动:

      ViewData["user"] = user; // or: ViewBag.user = user;
      ViewData["message"] = message; // or: ViewBag.message = message;
      return View("Edit");
      
    • 视图:

      @model Tuple<User, string>
      // accessing model data:
      @{ 
         var user = Model.Item1;
         var message = Model.Item2; 
      }
      
      // accessing model data:
      @{
          var user = (User)ViewData["user"]; // or: User user = ViewBag.user;
          var message = (string)ViewData["message "]; // or: string message = ViewBag.message ;
      }
      

但是,最终您通常会意识到最好创建一个单独的viewmodel类

匿名对象不会真正工作,因为您必须在视图中使用反射来访问其属性

您的选择:

  • 元组

    • 操作:
      返回视图(“编辑”,Tuple.Create(用户,消息))
    • 视图:

      @model Tuple<User, string>
      // accessing model data:
      @{ 
         var user = Model.Item1;
         var message = Model.Item2; 
      }
      
      // accessing model data:
      @{
          var user = (User)ViewData["user"]; // or: User user = ViewBag.user;
          var message = (string)ViewData["message "]; // or: string message = ViewBag.message ;
      }
      
  • 视图包/视图数据

    • 行动:

      ViewData["user"] = user; // or: ViewBag.user = user;
      ViewData["message"] = message; // or: ViewBag.message = message;
      return View("Edit");
      
    • 视图:

      @model Tuple<User, string>
      // accessing model data:
      @{ 
         var user = Model.Item1;
         var message = Model.Item2; 
      }
      
      // accessing model data:
      @{
          var user = (User)ViewData["user"]; // or: User user = ViewBag.user;
          var message = (string)ViewData["message "]; // or: string message = ViewBag.message ;
      }
      


但是,最终您通常会意识到最好创建一个单独的viewmodel类

谷歌
ViewBag
我的意思是,你应该只使用ViewModels@maccettura我的意思是-是的,viewmodels还可以,但我认为仅仅增加一个字符串就太过分了。@Xiaox但这并不过分。每个需要数据/模型的视图都应该有一个ViewModel。您不应该在视图中使用实体/数据模型。建立一个抽象层和隔离层。以后你会感谢自己的谷歌
ViewBag
我的意思是,你应该只使用ViewModels@maccettura我的意思是-是的,viewmodels还可以,但我认为仅仅增加一个字符串就太过分了。@Xiaox但这并不过分。每个需要数据/模型的视图都应该有一个ViewModel。您不应该在视图中使用实体/数据模型。建立一个抽象层和隔离层。以后你会感谢自己的这不是个好主意。尽可能使用强类型对象。我知道这一点,但这不是问题所在。这不是一个好主意。你应该尽可能使用强类型对象。我知道,但这不是问题所在。哇。我试过了,但可能。。。更新@View:(无论如何,谢谢。哇。我试过了,但可能是更新了@View:(无论如何,谢谢。说到ASP.NET核心,我更喜欢ValueTuples。@AdamSimon这是一个公平的观点。我现在就编辑一个例子。谢谢你的建议。@JohnH我恐怕
@model(用户,字符串消息)
不起作用。Razor对我来说崩溃了。但是,
@model ValueTuple
是可以的,例如,你可以这样分解tuple:
var(用户,消息)=Model;
@JohnH好的,我做了一些挖掘。它在ASP.NET Core 2.1中运行良好,但在2.0中崩溃。在后一种情况下,C#7.1是Razor支持的最高语言版本,这似乎还不够。至少,我发现没有办法让它工作。底线是:元组语法只能在2.1及以上版本中工作。@Adamsimmon FWIW,这可能是b因为在早期版本的.NET Core中,
ValueTuple
通常需要一个NuGet和一个
using
。如果您有NuGet,并将
using
添加到
\u ViewImports.cshtml
,它也可能在ASP.NET Core 2.0中工作。说到ASP.NET Core,我更喜欢ValueTuple。@Adamsmon这是一个公平的观点。我将编辑一个示例现在开始。谢谢你的建议。@JohnH我担心
@model(User-User,string-message)
不起作用。Razor为我崩溃了。但是,
@model-ValueTuple
是可以的,然后你可以像这样分解元组:
var(User,message)=Model;
@JohnH好的,我做了一些挖掘。它在ASP.NET Core 2.1中运行良好,但在2.0中崩溃。在后一种情况下,C#7.1是Razor支持的最高语言版本,这似乎还不够。至少,我发现没有办法让它工作。底线是:元组语法只能在2.1及以上版本中工作。@Adamsimmon FWIW,这可能是because
ValueTuple
用于在.NE的早期版本中要求使用NuGet和