.NET Core - MVC 应用中的控制器方法和视图

  电影应用的开头不错,但展示效果不理想.

  例:ReleaseDate 应为两个词

    打开Models/movie.cs,并添加以下代码:

      using引用:

        using System.ComponentModel.DataAnnotations;

        using System.ComponentModel.DataAnnotations.Schema;

      ReleaseDate特性修改为:
        [Display(Name = "Release Date")]

        [DataType(DataType.Date)]

        备注:Display特性 指定要显示的字段名称的内容

           DataType属性指定数据的类型          

      Price特性修改为:
        [Column(TypeName = "decimal(18, 2)")]

        备注:特性为数据注释,将Price正确地映射到数据库中的货币

  浏览Movie App(地址:https://localhost:5001/Movies)将鼠标指针悬停在“Edit”链接上查看目标URL(显示在Page页面左下角)

  “Edit”“Details”“Delete”链接是在Views/Movies/Index。cshtml文件中由Core MVC定位标记帮助程序生成的。打开该页面,查看代码:

    <td>

      <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
      <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
      <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
    </td>

  标记帮助程序使服务器端代码可以在Razor文件中参与创建和呈现HTML元素。  

  标记帮助程序从控制器操作方法和路由 ID 动态生成 HTML href 特性值。

  重新调用在 Program.cs 文件中设置的路由的格式:

    app.MapControllerRoute(

      name: "default",
      pattern: "{controller=Home}/{action=Index}/{id?}");

  .NET Core 将 https://localhost:5001/Movies/Edit/4 转换为对 Movies 控制器的 Edit 操作方法的请求,参数 Id 为 4。(控制器方法也称为操作方法。)

  打开 Movies 控制器并检查两个 Edit 操作方法。

  以下代码显示了 HTTP GET Edit 方法,此方法将提取电影并填充由 Edit.cshtmlRazor 文件生成的编辑表单。

    例:// GET: Movies/Edit/5

      public async Task<IActionResult> Edit(int? id)
      {
        if (id == null || _context.Movie == null)
        {
          return NotFound();
        }

        var movie = await _context.Movie.FindAsync(id);
        if (movie == null)
        {
          return NotFound();
        }
        return View(movie);
      }

      采用电影 ID 参数,使用Entity Framework FindAsync 方法查找电影,并将所选电影返回到“编辑”视图。 如果无法找到电影,则返回 NotFound (HTTP 404)。

   以下代码显示 HTTP POST Edit 方法,它会处理已发布的电影值。

    例:// POST: Movies/Edit/5

      // To protect from overposting attacks, enable the specific properties you want to bind to.
      // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
      [HttpPost]
      [ValidateAntiForgeryToken]
      public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price")] Movie movie)
      {
        if (id != movie.Id)
        {
          return NotFound();
        }

        if (ModelState.IsValid)
        {
          try
          {
            _context.Update(movie);
            await _context.SaveChangesAsync();
          }
          catch (DbUpdateConcurrencyException)
          {
          if (!MovieExists(movie.Id))
          {
            return NotFound();
          }
          else
          {
            throw;
          }
        }
        return RedirectToAction(nameof(Index));
      }
      return View(movie);
    }

  备注:[Bind]特性是防止过度发布的一种方法。只应在[Bind]特性中包含想要更改的属性。

     [HttpPost]特性指定只能为POST请求调用此Edit方法。可将 [HttpGet] 属性应用于第一个编辑方法,但不是必需,因为 [HttpGet] 是默认设置。

     [ValidateAntiForgeryToken]特性 验证表单标记帮助程序中的防伪标记生成器生成的隐藏的 XSRF 标记,用于防止请求伪造,

                    并与编辑视图文件 (Views/Movies/Edit.cshtml) 中生成的防伪标记相配对。

                       编辑视图文件使用表单标记帮助程序生成防伪标记。

       例 : <form asp-action="Edit">

        表单标记帮助程序会生成隐藏的防伪标记,此标记必须与电影控制器的 Edit 方法中 [ValidateAntiForgeryToken] 生成的防伪标记相匹配。

      ModelState.IsValid :验证表单中提交的数据是否可以用于修改(编辑或更新)Movie 对象。

                 如果数据有效,将保存此数据。 通过调用数据库上下文的 SaveChangesAsync 方法,将更新(编辑)的电影数据保存到数据库。

                    保存数据后,代码将用户重定向到 MoviesController 类的 Index 操作方法,此方法显示电影集合,包括刚才所做的更改。

  在表单发布到服务器之前,客户端验证会检查字段上的任何验证规则。 如果有任何验证错误,则将显示错误消息,并且不会发布表单。

  如果禁用 JavaScript,则不会进行客户端验证,但服务器将检测无效的发布值,并且表单值将与错误消息一起重新显示。

  当基架系统创建“编辑”视图时,它会检查 Movie 类并创建代码为类的每个属性呈现 <label> 和 <input> 元素。(查看Views/Movies/Edit.cshtml文件)

    请注意视图模板在文件顶端有一个 @model MvcMovie.Models.Movie 语句。 @model MvcMovie.Models.Movie 指定视图期望的视图模板的模型为 Movie 类型。

    <input> 元素位于 HTML <form> 元素中,后者的 action 特性设置为发布到 /Movies/Edit/id URL。

    当单击 Save 按钮时,表单数据将发布到服务器。 关闭 </form> 元素之前的最后一行显示表单标记帮助程序生成的隐藏的XSRF标记。

  电影控制器中的所有 HttpGet 方法都遵循类似的模式。

  它们获取电影对象(对于 Index获取的是对象列表)并将对象(模型)传递给视图。 

  Create 方法将空的电影对象传递给 Create 视图。

  在方法的 [HttpPost] 重载中,创建、编辑、删除或以其他方式修改数据的所有方法都执行此操作。

  以 HTTP GET 方式修改数据是一种安全隐患。

  以 HTTP GET 方法修改数据也违反了 HTTP 最佳做法和架构REST模式,后者指定 GET 请求不应更改应用程序的状态。

  换句话说,执行 GET 操作应是没有任何隐患的安全操作,也不会修改持久数据。

posted @ 2022-06-29 18:02  大师兄被妖怪抓走了  阅读(178)  评论(0编辑  收藏  举报