15 控制器与视图之数据传递与模型绑定

在我们上篇的内容中,我们讨论了如何创建和使用视图。在这一章中,我们将深入探讨如何在控制器与视图之间传递数据,以及如何进行模型绑定。这些知识对于构建动态网站非常重要,因为它们使得用户输入的数据能够与我们的后端逻辑无缝对接。

数据传递

1. 将数据发送到视图

在ASP.NET Core MVC中,控制器是处理用户请求的主要组件。我们可以通过控制器将数据发送到视图。有几种方法可以做到这一点:

  • 视图数据(ViewData)
    使用 ViewData 传递数据是最简单的方法之一。ViewData 是一个字典,您可以在控制器中将数据添加到其中,随后在视图中读取这些值。

    1
    2
    3
    4
    5
    6
    7
    8
    public class HomeController : Controller
    {
    public IActionResult Index()
    {
    ViewData["Message"] = "欢迎来到我的网站!";
    return View();
    }
    }

    在视图中,您可以这样访问这个值:

    1
    <h1>@ViewData["Message"]</h1>
  • 视图模型(ViewModel)
    使用专门的视图模型(ViewModel)是另一种推荐的方式。视图模型是一个类,用于封装视图所需的数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class MyViewModel
    {
    public string Message { get; set; }
    public int Count { get; set; }
    }

    public class HomeController : Controller
    {
    public IActionResult Index()
    {
    var model = new MyViewModel
    {
    Message = "欢迎来到我的网站!",
    Count = 10
    };
    return View(model);
    }
    }

    在视图中,您可以通过强类型的视图模型来访问数据:

    1
    2
    3
    4
    @model MyViewModel

    <h1>@Model.Message</h1>
    <p>计数: @Model.Count</p>

2. 从视图接收数据

用户输入的数据通常会通过表单提交到控制器。ASP.NET Core MVC通过模型绑定(Model Binding)来处理这些数据。模型绑定的过程是自动的,它会将从表单提交的数据映射到控制器方法的参数中。

模型绑定

模型绑定的工作机制非常强大。下面是一个基本的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}

public class HomeController : Controller
{
[HttpPost]
public IActionResult Submit(User user)
{
if (ModelState.IsValid)
{
// 处理用户数据
return RedirectToAction("Success");
}

return View(user);
}
}

在视图中,您可以使用 Tag Helpers 创建一个简单的表单:

1
2
3
4
5
6
7
8
9
10
11
@model User

<form asp-action="Submit" method="post">
<label asp-for="Name"></label>
<input asp-for="Name" />

<label asp-for="Age"></label>
<input asp-for="Age" />

<button type="submit">提交</button>
</form>

3. 处理复杂模型

有时候,您的模型可能会更复杂,包含嵌套对象或集合。模型绑定同样能处理这些情况:

1
2
3
4
5
6
7
8
9
10
11
public class Order
{
public int Id { get; set; }
public List<Item> Items { get; set; }
}

public class Item
{
public string ProductName { get; set; }
public int Quantity { get; set; }
}

您的视图可以包含一个包含多个项目的表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@model Order

<form asp-action="SubmitOrder" method="post">
<input type="hidden" asp-for="Id" />

@for (int i = 0; i < Model.Items.Count; i++)
{
<div>
<label asp-for="Items[i].ProductName"></label>
<input asp-for="Items[i].ProductName" />

<label asp-for="Items[i].Quantity"></label>
<input asp-for="Items[i].Quantity" />
</div>
}

<button type="submit">提交订单</button>
</form>

在控制器中,您可以通过模型绑定容易地获取提交的数据:

1
2
3
4
5
6
7
8
9
10
[HttpPost]
public IActionResult SubmitOrder(Order order)
{
if (ModelState.IsValid)
{
// 处理订单数据
}

return View(order);
}

结论

在本节中,我们讨论了如何在ASP.NET Core MVC中进行数据传递和模型绑定。通过使用 ViewData、视图模型和表单,我们能够有效地从控制器向视图传递数据,并将视图中的用户输入数据提交回控制器。这为构建动态和互动丰富的Web应用打下了坚实的基础。

在下一章节中,我们将探讨依赖注入的概念,这是ASP.NET Core框架的核心特性之一,能够帮助我们创建更松耦合和易于测试的应用程序。

15 控制器与视图之数据传递与模型绑定

https://zglg.work/aspnet-core-zero/15/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论