博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Controller methods and views
阅读量:5914 次
发布时间:2019-06-19

本文共 11406 字,大约阅读时间需要 38 分钟。

We have a good start to the movie app, but the presentation is not ideal. We don’t want to see the time (12:00:00 AM in the image below) and ReleaseDate should be two words.

Open the Models/Movie.cs file and add the highlighted lines shown below:

public class Movie{    public int ID { get; set; }    public string Title { get; set; }    [Display(Name = "Release Date")]    [DataType(DataType.Date)]    public DateTime ReleaseDate { get; set; }    public string Genre { get; set; }    public decimal Price { get; set; }}

using System.ComponentModel.DataAnnotations;

 

We’ll cover  in the next tutorial.

The  attribute specifies what to display for the name of a field (in this case “Release Date” instead of “ReleaseDate”).  

The  attribute specifies the type of the data, in this case it’s a date, so the time information stored in the field is not displayed.

 

Browse to the Movies controller and hold the mouse pointer over an Edit link to see the target URL.

 

 

The EditDetails, and Delete links are generated by the MVC Core Anchor Tag Helper in theViews/Movies/Index.cshtml file.

 

 enable server-side code to participate in creating and rendering HTML elements in Razor files.

In the code above, the  dynamically generates the HTML href attribute value from the controller action method and route id.

You use View Source from your favorite browser or use the F12 tools to examine the generated markup.

The F12 tools are shown below.

Chrome浏览器,在界面上右键,检查:然后会弹出一个浏览界面,左上角的指针图标,单击之后,移动到页面上,会随着移动而展开html

 

 

Recall the format for routing set in the Startup.cs file.

app.UseMvc(routes =>            {                routes.MapRoute(                    name: "default",                    template: "{controller=Home}/{action=Index}/{id?}");            });

 

ASP.NET Core translates http://localhost:1234/Movies/Edit/4 into

a request to the Edit action method of the Movies controller with the parameter ID of 4.

(Controller methods are also known as action methods.)

 

 are one of the most popular new features in ASP.NET Core. See  for more information.

Open the Movies controller and examine the two Edit action methods:

// GET: Movies/Edit/5        public async Task
Edit(int? id) { if (id == null) { return NotFound(); } var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); if (movie == null) { return NotFound(); } return View(movie); } // POST: Movies/Edit/5 // To protect from overposting attacks, please 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
Edit(int id, [Bind("ID,Genre,Price,ReleaseDate,Title")] 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("Index"); } return View(movie); }

 

The [Bind] attribute is one way to protect against .

You should only include properties in the [Bind] attribute that you want to change.

See  for more information.

  provide an alternative approach to prevent over-posting.

 

 

Notice the second Edit action method is preceded by the [HttpPost] attribute.

[HttpPost][ValidateAntiForgeryToken]public async Task
Edit(int id, [Bind("ID,Genre,Price,ReleaseDate,Title")] 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("Index"); } return View(movie);}

The  attribute specifies that this Edit method can be invoked only for POST requests.

You could apply the [HttpGet] attribute to the first edit method, but that’s not necessary because [HttpGet] is the default.

 

The  attribute is used to prevent forgery of a request and is paired up with an anti-forgery token generated in the edit view file (Views/Movies/Edit.cshtml).

The edit view file generates the anti-forgery token with the .

The  generates a hidden anti-forgery token that must match the[ValidateAntiForgeryToken] generated anti-forgery token in the Edit method of the Movies controller.

For more information, see .

 

The HttpGet Edit method takes the movie ID parameter, looks up the movie using the Entity Framework SingleOrDefaultAsync method, and returns the selected movie to the Edit view.

If a movie cannot be found, NotFound (HTTP 404) is returned.

public async Task
Edit(int? id){ if (id == null) { return NotFound(); } var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); if (movie == null) { return NotFound(); } return View(movie);}

 

 

When the scaffolding system created the Edit view, it examined the Movie class and created code to render <label> and <input> elements for each property of the class.

The following example shows the Edit view that was generated by the visual studio scaffolding system:

@model MvcMovie.Models.Movie@{    ViewData["Title"] = "Edit";}

Edit

Movie


@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}}

 

Notice how the view template has a @model MvcMovie.Models.Movie statement at the top of the file — this specifies that the view expects the model for the view template to be of type Movie.

 

The scaffolded code uses several Tag Helper methods to streamline the HTML markup.

The -  displays the name of the field (“Title”, “ReleaseDate”, “Genre”, or “Price”).

The  renders an HTML <input> element.

The  displays any validation messages associated with that property.

 

Run the application and navigate to the /Movies URL. Click an Edit link.

In the browser, view the source for the page.

The generated HTML for the <form> element is shown below.

Movie


The <input> elements are in an HTML <form> element whose action attribute is set to post to the/Movies/Edit/id URL.

The form data will be posted to the server when the Save button is clicked.

The last line before the closing </form> element shows the hidden  token generated by the.

 

 

Processing the POST Request

The following listing shows the [HttpPost] version of the Edit action method.

 

[HttpPost][ValidateAntiForgeryToken]public async Task
Edit(int id, [Bind("ID,Genre,Price,ReleaseDate,Title")] 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("Index"); } return View(movie);}

The [ValidateAntiForgeryToken] attribute validates the hidden  token generated by the anti-forgery token generator in the 

 

The  system takes the posted form values and creates a Movie object that’s passed as the movie parameter.

The ModelState.IsValid method verifies that the data submitted in the form can be used to modify (edit or update) a Movie object.

If the data is valid it’s saved.

The updated (edited) movie data is saved to the database by calling the SaveChangesAsync method of database context.

After saving the data, the code redirects the user to the Index action method of the MoviesController class, which displays the movie collection, including the changes just made.

 

Before the form is posted to the server, client side validation checks any validation rules on the fields.

If there are any validation errors, an error message is displayed and the form is not posted.

If JavaScript is disabled, you won’t have client side validation but the server will detect the posted values that are not valid, and the form values will be redisplayed with error messages.

Later in the tutorial we examine  validation in more detail.

The  in theViews/Book/Edit.cshtml view template takes care of displaying appropriate error messages.

 

 

All the HttpGet methods in the movie controller follow a similar pattern.

They get a movie object (or list of objects, in the case of Index), and pass the object (model) to the view.

The Create method passes an empty movie object to the Create view.

All the methods that create, edit, delete, or otherwise modify data do so in the [HttpPost] overload of the method.

Modifying data in an HTTP GET method is a security risk, as in .

Modifying data in a HTTP GET method also violates HTTP best practices and the architectural  pattern, which specifies that GET requests should not change the state of your application.

In other words, performing a GET operation should be a safe operation that has no side effects and doesn’t modify your persisted data.

 

Additional resources

  • Protect your controller from 

 

转载地址:http://cvgpx.baihongyu.com/

你可能感兴趣的文章
java 常见几种发送http请求案例[转]
查看>>
更改Visual Studio 2010/2012/2008的主题设置
查看>>
win7系统安装hadoop
查看>>
day5作业购物商城+ATM
查看>>
day6作业--选课系统
查看>>
stegsolve---图片隐写查看器
查看>>
dubbo接口测试
查看>>
Maven生命周期详解(转)
查看>>
uoj#401. 【CTSC2018】青蕈领主(分治FFT)
查看>>
jvm -Xms -Xmx
查看>>
bash的pushd和popd
查看>>
2018 German Collegiate Programming Contest (GCPC 18)
查看>>
前端之jquery
查看>>
静态类和非静态类
查看>>
关于日志表的自动创建及分表储存
查看>>
topcoder srm 315 div1
查看>>
【super vlan的配置】
查看>>
洛谷P1443 马的遍历
查看>>
日期字符串格式化
查看>>
ps基本操作
查看>>