• MVC04


    1. 从页面到action

    讲述controller与View之间的具体运作关系

    在上次添加的名为Movie的Model内添加

    下面我们尝试为该model内的属性添加attribute

    具体修改如下:

    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;
    
    namespace MvcMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            // 添加命名空间
            // Display属性,修改属性名称
            [Display(Name ="Release Date")]
            // 该属性值类型限定
            [DataType(DataType.Date)]
            // 限定格式
            [DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}",ApplyFormatInEditMode = true)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    
        public class MovieDBContext : DbContext
        {
            public DbSet<Movie> Movies { get; set; }
        }
    }

    运行项目后,页面中相关属性变化如下:

    这样的改变是如何生成的?

    观察我们Views下的Movies目录下的index文件,其中改变为:

              @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })

    这是razor引擎的一个方法,参数依次为:按钮名称,Action名称,参数(这里参数为id)

    能自动进行跳转的原因是系统已经默认配置了路由:

                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );

    接下来观察Movies的Controller中的Edit是怎么工作的

            public ActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Movie movie = db.Movies.Find(id);
                if (movie == null)
                {
                    return HttpNotFound();
                }
                return View(movie);
            }
    
            // POST: Movies/Edit/5
            // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 
            // 详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkId=317598
    // 使用Post方式
    [HttpPost]
    // 防止跨页请求攻击 [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie) { if (ModelState.IsValid) { db.Entry(movie).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(movie);

     2.解析Edit的Action和View

    回到MoviesController文件

    // GET: Movies/Edit/5
            public ActionResult Edit(int? id)
            {
                // 判断是否为空,为空则返回错误信息
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                // 数据库中获取Movies表并查找相应id
                Movie movie = db.Movies.Find(id);
                if (movie == null)
                {
                    // 查找不到指定id的项目
                    return HttpNotFound();
                }
                // 返回数据给view进行使用
                return View(movie);
            }
    
            // POST: Movies/Edit/5
            // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 
            // 详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkId=317598
            [HttpPost]
            [ValidateAntiForgeryToken]
            // 只允许暴露指定属性
            public ActionResult Edit([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(movie).State = EntityState.Modified;
                    db.SaveChanges();
                    // 完成修改
                    return RedirectToAction("Index");
                }
                return View(movie);
            }

    也可查看其相应的view(cshtml文件)

    3.解析Details的Action和View

    只有get方式,主要是用来获取详细信息的。

            public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Movie movie = db.Movies.Find(id);
                if (movie == null)
                {
                    return HttpNotFound();
                }
                return View(movie);
            }

    4.解析Delete的Action和View

    // GET: Movies/Delete/5
            public ActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Movie movie = db.Movies.Find(id);
                if (movie == null)
                {
                    return HttpNotFound();
                }
                return View(movie);
            }
    
            // POST: Movies/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                Movie movie = db.Movies.Find(id);
                db.Movies.Remove(movie);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
  • 相关阅读:
    asp.net Post Get提交数据转Model实例
    ETL构建数据仓库五步法
    什么是数据仓库-数据仓库的基本概念
    简单的说下什么是数据仓库
    简单理解Socket
    Net中的反射使用入门
    JS---BOM
    jQuery Ajax 全解析
    Ajax与JSON的一些总结
    ASP.NET中验证控件的使用
  • 原文地址:https://www.cnblogs.com/Tanqurey/p/12237511.html
Copyright © 2020-2023  润新知