• ASP.NET MVC Notes


    1. inetmgr 进入IIS
    2. ViewBag和ViewData在run-time的时候检查错误,View中的用法如下: 
    3.    @*ViewBag传递的是动态对象*@
          @foreach (string item in ViewBag.listData)
          {
              <li>@item</li>
          }
          -----------------------------------------
          @*ViewData传递的是Object,所以要转换类型*@
          @foreach (string item in (List<string>)ViewData["Countries"])
          {
              <li>@item</li>
          }
    4. web.config中连接字符串名称需要和DbContext的类名称一致:
    5. public class EmployeeContext : DbContext
          {
              //定义对应到数据库表的对象集合
              public DbSet<Employee> Employees { get; set; }
          }
      
          <add name="EmployeeContext"
               providerName="System.Data.SqlClient"
               connectionString="Data Source=.;Initial Catalog=MVCSample;User ID= ;Password= ; "  />
    6. Global.ashx 程序运行初始化配置:
    7. //DBFirst从数据读取数据,程序运行的时候EmployeeContext初始化为Null
          Database.SetInitializer<MVCBlog.Models.EmployeeContext>(null);
    8. View需要List数组对象,则强类型直接定义为IEnumerable; View中@using引用需要用到的类 
    9. @model IEnumerable<MVCBlog.Models.Employee>
      @using MVCBlog.Models
      
      @{
          ViewBag.Title = "Index";
          Layout = "~/Views/Shared/_Layout.cshtml";
      }
      
      <h2>Index</h2>
      
      @*Controller 传递过来的是List对象,所以强类型定义为List<MVCBlog.Models.Employee>*@
      <ul>
          @foreach (Employee employee in @Model)
          {
              <li> @Html.ActionLink(employee.Name, "Details", new { @id = @employee.EmployeeID })  </li>
          }
      </ul>
    10. 业务逻辑层获取数据
    11. public IEnumerable<Employee> employees
              {
                  get
                  {
                      string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
      
                      List<Employee> employees = new List<Employee>();
      
                      using (SqlConnection con = new SqlConnection(connectionString))
                      {
      
                          SqlCommand cmd = new SqlCommand("sp_GetAllEmployee", con);
                          cmd.CommandType = CommandType.StoredProcedure;
                          con.Open();
                          SqlDataReader sdr = cmd.ExecuteReader();
                          while (sdr.Read())
                          {
                              Employee employee = new Employee();
                              employee.EmployeeID = Convert.ToInt32(sdr["EmployeeID"]);
                              employee.Name = sdr["Name"].ToString();
                              employee.City = sdr["City"].ToString();
                              employee.Gender = Convert.ToChar(sdr["Gender"]); 
      
                              employees.Add(employee);
                          }
                          return employees;
                      }
                  }
              }
    12. Razor中构建DropList:
    13.   @Html.DropDownList("Gender", new List<SelectListItem> {
                            new SelectListItem { Text="",Value="M"},
                            new SelectListItem{ Text="",Value="F"}
                      }, "Select Gender", htmlAttributes: new { @class = "control-label col-md-2" })
      //或者是在Controller中构建SelectList后,Razor中Render
        ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID); 

        @Html.DropDownList("DepartID", null, "Select Department",htmlAttributes: new { @class = "form-control" })
    14. Procedure AddEmployee
    15. CREATE PROCEDURE sp_AddEmployee
           @Name nvarchar(50)=null,
           @Gender char(1)=null,
           @City nvarchar(50)=null,
           @DateOfBirth DateTime=null
      AS
      BEGIN
          -- SET NOCOUNT ON added to prevent extra result sets from
          -- interfering with SELECT statements.
          Insert Into Employee(Name,Gender,City,DateOfBirth)
          values(@Name,@Gender,@City,@DateOfBirth)
      END
      GO
    16. Controller搜集从View页面Post过来的数据,有三种方法:
      1. FormCollection 中包含了所有表单数据的键值对集合,通过FromCollection[Key] 访问到View Post 过来的 Data
        1.  [HttpPost]
                  public ActionResult Create(FormCollection formCollection)
                  {
                      //foreach (string key in formCollection.AllKeys)
                      //{
                      //    Response.Write(key + " "); 
                      //    Response.Write(formCollection[key] + "<br/>");
                      //}
          
                      Employee employee = new Employee();
                      employee.Name = formCollection["Name"];
                      employee.Gender = Convert.ToChar(formCollection["Gender"]);
                      employee.City = formCollection["City"];
                      employee.DateOfBirth = Convert.ToDateTime(formCollection["DateOfBirth"]);
          
                      EmployeeService employeeService = new EmployeeService();
                      int numSucc = employeeService.AddEmployee(employee);
          
                      if (numSucc > 0)
                      {
                          return RedirectToAction("Index");
                      }
                      else
                      {
                          return View();
                      } 
                  }
          View Code
      2. 直接以参数的形式接收数据
        1.  [HttpPost]
                  public ActionResult Create(string Name,char Gender,string City,string DateOfBirth)
                  { 
                      Employee employee = new Employee();
                      employee.Name = Name;
                      employee.Gender = Gender;
                      employee.City = City;
                      employee.DateOfBirth = Convert.ToDateTime(DateOfBirth);
          
                      EmployeeService employeeService = new EmployeeService();
                      int numSucc = employeeService.AddEmployee(employee);
          
                      if (numSucc > 0)
                      {
                          return RedirectToAction("Index");
                      }
                      else
                      {
                          return View();
                      }
                  }
          View Code
      3. Controller中UpdaetModel 更新 Model,获得提交过来的数据 
        1.  [HttpPost]
                  [ActionName("Create")]
                  public ActionResult Create_Post()
                  {
                      Employee employee = new Employee();
                      UpdateModel<Employee>(employee);
          
                      int numSucc = 0;
                      if (ModelState.IsValid)
                      {
                          EmployeeService employeeService = new EmployeeService();
                          numSucc = employeeService.AddEmployee(employee);
                      } 
          
                      if (numSucc > 0)
                      {
                          return RedirectToAction("Index");
                      }
                      else
                      {
                          return View();
                      }
                  }
          View Code
    17. Service  新增数据服务:
      1. public int AddEmployee(Employee employee)
                {
                    int numSucc = 0;
                    using (SqlConnection conn = new SqlConnection(connectionString))
                    {
                        SqlCommand cmd = new SqlCommand("sp_AddEmployee", conn);
                        cmd.CommandType = CommandType.StoredProcedure;
                        SqlParameter[] paras = new SqlParameter[] {
                            new SqlParameter("Name",employee.Name),
                            new SqlParameter("Gender",employee.Gender),
                            new SqlParameter("City",employee.City),
                            new SqlParameter("DateOfBirth",employee.DateOfBirth)
                        };
                        cmd.Parameters.AddRange(paras);
        
                        conn.Open();
                        numSucc = cmd.ExecuteNonQuery();
                    }
        
                    return numSucc;
                }
        View Code
    18. 解决方案中的Nuget包管理器对解决方案中的Nuget包进行管理。
    19. Controller中模型绑定的两种方法:
      1,Bind 制定需要进行模型绑定传递到Controller中的数据。

      public ActionResult Edit_Post([Bind(Include = "Gender , City,DateOfBirth")]Employee employee)

      2,在UpdateModel中,传递需要更新或者是不需要更新的参数

      UpdateModel<Employee>(employee, null, null, new string[] { "Name" });

      3,定义IEmployee接口,Employee继承自IEmployee.

      UpdateModel<IEmployee>(employee);
    20. 进行数据的Delete动作必须在Post数据中执行
      1.   @foreach (var item in Model)
            {
                using (Html.BeginForm("Delete", "Employee", new { id = item.ID }))
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Gender)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.City)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.DateOfBirth)
                        </td>
                        <td>
                            @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
                            @Html.ActionLink("Details", "Details", new { id = item.ID }) | 
                            <input type="submit" value="Delete"  onclick="return confirm('确定删除 @item.Name 吗 ')" />
                        </td>
                    </tr>
                }
            }
        View Code
    21. EF中字段属性的控制,如:[Required]、[Display(Name="")]  需在partial class中进行处理
      1. [MetadataType(typeof(EmployeeMetaData))]
            public partial class Employee
            {
        
            }
            public class EmployeeMetaData
            {
                [Required]
                [Display(Name = "姓名")]
                public string Name { get; set; }
        
                [Required]
                [Display(Name = "性别")]
                public char Gender { get; set; }
        
                [Required]
                [Display(Name = "所在城市")]
                public string City { get; set; }
        
                [Required]
                [Display(Name = "生日")]
                public DateTime DateOfBirth { get; set; }
                 
                [Required]
                [Display(Name = "部门")]
                public int DepartID { get; set; } 
            }
        View Code
    22. Edit信息的时候不需要更新字段的处理,如不需要更新Name。
      1. partial class 中 去掉 [Required]
      2. Edit方法中用 查出来的实体来存储更新后的数据
      3.  [HttpPost]
                [ValidateAntiForgeryToken]
                public ActionResult Edit([Bind(Include = "ID,Gender,City,DateOfBirth,DepartID")] Employee employee)
                {
                    Employee employeeFromDB = db.Employee.Find(employee.ID);
        
                    //须要用你查出来的实体来存储更新后的数据,不更新Name字段
                    employeeFromDB.City = employee.City;
                    employeeFromDB.Gender = employee.Gender;
                    employeeFromDB.DepartID = employee.DepartID;
                    employeeFromDB.DateOfBirth = employee.DateOfBirth;
        
                    if (ModelState.IsValid)
                    {
                        db.Entry(employeeFromDB).State = EntityState.Modified;
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                    ViewBag.DepartID = new SelectList(db.Department, "ID", "Name", employee.DepartID);
                    return View(employee);
                }
        View Code
      4. Controller的Create方法中必需的字段,添加验证检查处理
      5.  if (string.IsNullOrEmpty(employee.Name))
                    {
                        ModelState.AddModelError("Name", "姓名为必需字段");
                    }
        View Code
    23. Lambda表达式,统计Department下Employee数量
      1.  [HttpGet]
                public ActionResult EmployeeByDepartment()
                {
                    var departmentTotals = db.Employee.Include("Department")
                        .GroupBy(d => d.Department.Name)
                        .Select(y => new DepartmentTotals
                        {
                            Name = y.Key,
                            Total = y.Count()
                        }).ToList().OrderByDescending(y => y.Total);
        
                    return View(departmentTotals);
                }
        View Code
    24. Controller中Return View()中如果指定带有后缀的View,如index.cshtml,则需要传递完整路径:
      1.  public ActionResult Index()
                {
                    var employee = db.Employee.Include(e => e.Department);
                    return View("~/Views/Employee/Index.cshtml",employee.ToList());
                }
        View Code
  • 相关阅读:
    【Vue CLI】手把手教你撸插件
    深入理解web协议(二):DNS、WebSocket
    同城双活与异地多活架构分析
    vivo 商城前端架构升级-总览篇
    原CSDN搬家地址
    PHP 7.1安装xhprof进行性能分析
    nginx配置http和https可同时访问方法, listen ssl与 ssl on区别
    sudo pm2 找不到命令
    HAProxy配置SSL
    docker部署nginx+php的 各种坑
  • 原文地址:https://www.cnblogs.com/i-shanghai/p/5814635.html
Copyright © 2020-2023  润新知