我想实现这样的目标:
public IActionResult Test(string id)
{
(...)
var user = context.Users.First(x => x.Id.ToString() == id);
var message = "abc";
return View("Edit", user, message);
}
是否可以不创建ViewModel呢?
答案 0 :(得分:2)
我完全同意尽可能使用视图模型的建议。即使看起来有时有些矫kill过正,它们也更容易使用。
也就是说,要回答您的问题,您可以为此使用Tuple
:
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);
}
然后在视图中,您将需要以下内容:
@model Tuple<User, string>
只需确保将正确的名称空间添加到视图中的User
类型。
为完整起见,下面是一个使用C#7中的ValueTuple
的示例,以下是亚当的评论:
public IActionResult Test(string id)
{
var user = context.Users.First(x => x.Id.ToString() == id);
var message = "abc";
return View("Edit", (user, message));
}
如果您使用的是.NET Core 2.1及更高版本,则视图的model
指令将变为:
@model (User user, string message)
然后您将像这样访问那些内容:
@Model.user
否则,您将需要使用(评论中的@AdamSimon信用):
@model ValueTuple<User, string>
var (user, message) = Model;
有关更多信息,请参见MSDN上的What's New in C# 7.0博客文章。
答案 1 :(得分:1)
您可以使用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;
}
答案 2 :(得分:0)
尝试使用匿名对象:
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});
}
答案 3 :(得分:0)
添加一个附加字符串字段时,可以使用ViewBag。
public IActionResult Test(string id)
{
(...)
var user = context.Users.First(x => x.Id.ToString() == id);
ViewBag.message = "abc";
return View("Edit", user);
}
我在这里同意其他人的观点,如果它变得更加复杂,则视图模型将节省大量时间。
答案 4 :(得分:0)
匿名对象将无法真正工作,因为您必须在视图中使用反射来访问其属性。
您的选择:
故事
return View("Edit", Tuple.Create(user, message));
查看:
@model Tuple<User, string>
// accessing model data:
@{
var user = Model.Item1;
var message = Model.Item2;
}
值元组
return View("Edit", (user, message));
查看:
@model ValueTuple<User, string>
// accessing model data:
@{
var (user, message) = Model;
}
ViewBag / ViewData
操作:
ViewData["user"] = user; // or: ViewBag.user = user;
ViewData["message"] = message; // or: ViewBag.message = message;
return View("Edit");
查看:
// accessing model data:
@{
var user = (User)ViewData["user"]; // or: User user = ViewBag.user;
var message = (string)ViewData["message "]; // or: string message = ViewBag.message ;
}
但是,最后,您通常会发现最好创建一个单独的viewmodel类。 ;)