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

时间:2018-08-08 19:08:37

标签: 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呢?

5 个答案:

答案 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类。 ;)