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,这可能是becauseValueTuple
用于在.NE的早期版本中要求使用NuGet和