MVC工作中的笔记~2(架构师是一步一步练成的)

11 重写类的ToString()方法的作用:
protected void Page_Load(object sender, EventArgs e)
    {
        info infos = new info("zzl", "male", 27);
       Response.Write(infos.ToString());
    }
   

class info
{
    public string Name { get; set; }
    public string Gander { get; set; }
    public int Age { get; set; }
    public info(string name,string gander,int age)
    {
        Name = name;
        Gander = gander;
        Age = age;
    }

    public override string ToString() //本类中的ToString()方法进行格式化
    {
        string str = string.Format("姓名:{0}\n性别:{1}\n年龄:{2}\n", Name,Gander,Age);
        return str;
    }

 public override int GetHashCode()  //重写ToString()方法,也必须重写GetHashCode()方法
    {
        return base.GetHashCode();
    }


12 类的嵌套 
    class a
    { ...
    class sub_a  
    //不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、
      protected internal、protected、internal 或 private。
      {
         ...
      }
    }
    例如:
        big.small wrap = new big.small("zzl");
        Response.Write(wrap.ToString());
class big
  {
   public  class small
    {
        public string Name { get; set; }
        public small(string name)
        {
            Name = name;
        }
        public override string ToString()
        {
            return string.Format("姓名是:{0}", Name);
        }
    }

13 Lambda表达式的高级用法,where关键字
     例1:
       List<string> fruits =new List<string> { "1", "2", "3", "4", "5", "6", "7", "8" }; //定义一个list的string类型
       IEnumerable<string> query = fruits.Where(fruit => fruit.Contains('8'));//定义一个IEnumerable类型的字符串,它接收的值是fruits列表中的字符8,=> 是lambda关键字
       foreach (string fruit in query) //输出query列表中的每一个字符
         Response.Write(fruit);
     例2:
        string[] digits = { "1", "22", "333", "4444", "55555", "666666", "7777777"};
        var shortDigits = digits.Where(digit => digit.Length < 4); //判断每个字符的长度是否小于4
        Response.Write("<hr>");
        foreach (var digit in shortDigits)
        {
            Response.Write(digit+",");    
        }
        Response.Write("<hr>");

14 LINQ实现对类的筛选器功能
      IEnumerable<string> x=new List<string> {"1","zzl","good"}; //为对象赋值
        
       foreach (var info in  x.ForUser("zzl"))   //从其中筛选zzl这个字符
        {
            Response.Write(info);
        }

public static class filter
{
    public static IEnumerable<string> ForUser(this IEnumerable<string> qry, string userName)   //这是一个字符的筛选功能,第1个能数是集合,它不是一个参数,第二个参数是要找的对象
    {
        return from a in qry
               where
                   a.Contains(userName.ToLower())
               select a;

    }

}

15  接口类型的变更://实际上,在程序中,接口类型的变量,它享有本接口的所有属性和方法,并且它继承它基类的所有方法
interface a
{
    string Name { get; set; }
    void Add();
}

 interface b:a
{
     string Password { get; set; }
}
class aclass : b
{
    public string Name { get; set; }
    public string Password { get; set; }
    public aclass(string name,string pass)
    {
        Name = name;
        Password = pass;
    }
    public void Add()
    {
    }

public a variable; // 定义一个接口类型的变更variable,接口为a
variable.Name=...//为属性赋值
variable.add();//调用方法
16 定义接口的两种形式
    interface a
    {
    string name;
    void add();
    }
    class ac:a
    {
        public string name{get;set;}
        public void add()
        {...}
    }
public a Ainstance {get;set;}
也可以写成
public a Ainstance 
这时,VS智能提示为: a.name          a.Ainstance()

17 在MVC中实现表单的验证
       [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(product pro)
        {
           // 表单验证
            if (String.IsNullOrEmpty(pro.productid.ToString()))
            {
                ModelState.AddModelError("productid", "产品ID不能为空");
            }
            if (string.IsNullOrEmpty(pro.typeid.ToString()))
            {
                ModelState.AddModelError("typeid", "类别不能为空");
            }

            if (ModelState.IsValid) //如果验证通过
            {

                try
                {
                    ProductRepository.Add(pro);
                    ProductRepository.Save();
                    return RedirectToAction("Details", new { id = pro.productid });
                }
                catch
                {
                    return View();
                }

            }
            else
            {
                return View(); //如果不通过验证,就直接反回本页 
            }
        }


18  MVC中的模型绑定 [Bind(include)] 和平[Bind(Exclude)] 
 Asp.Net MVC内置了两种不同的模型绑定功能,第一种是使用UpdateModel()更新一个已存在的模型对象的属性,
 第二种是传递模型对象,作为action方法的参数。这两种绑定的功能都相当强大。如下:
   第一种模型绑定

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, FormCollection formValues)
        {
            Dinners dinners = dinnerRepository.GetDinners(id);

            try
            {
                UpdateModel(dinners);
                dinnerRepository.Save();
                return RedirectToAction("Details", new { id = dinners.DinnerID });
            }
            catch
            {
                ModelState.AddRuleViolations(dinners.GetRuleViolations());
                return View(dinners);
            }
        }
    第二种模型绑定

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(Dinners dinners)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    dinners.HostedBy = "SomeUser";
                    dinnerRepository.Add(dinners);
                    dinnerRepository.Save();
                    return RedirectToAction("Details", new { id = dinners.DinnerID });
                }
                catch
                {
                    ModelState.AddRuleViolations(dinners.GetRuleViolations());
                }
                
            }
            return View(dinners);
        }
   默认情况下,UpdateModel()方法试图根据匹配的表单参数值,更新所有的属性。同样的作为参数传递给action方法的模型对象,
   基于表单参数设置全部模型对象的属性。但是有时,我们根据显式的指定模型对象的部分属性可更新,此种做法称作模型绑定的
   锁定,可分为基于用途来锁定绑定和基于类型来锁定绑定两种方式。
    基于用途来锁定绑定,下面是针对第一种模型绑定的锁定方式:
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, FormCollection formValues)
        {
            Dinners dinners = dinnerRepository.GetDinners(id);

            //指定模型对象可更新的属性列表
            String[] allowPropery = new[] { "Title", "Description", "ContactPhone" };

            try
            {
                //使用UpdateModel重载方法
                UpdateModel(dinners,allowPropery);
                dinnerRepository.Save();
                return RedirectToAction("Details", new { id = dinners.DinnerID });
            }
            catch
            {
                ModelState.AddRuleViolations(dinners.GetRuleViolations());
                return View(dinners);
            }
        }
    第二种模型绑定的锁定方式:
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Include="Title,Description,ContactPhone")]Dinners dinners)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    dinners.HostedBy = "SomeUser";
                    dinnerRepository.Add(dinners);
                    dinnerRepository.Save();
                    return RedirectToAction("Details", new { id = dinners.DinnerID });
                }
                catch
                {
                    ModelState.AddRuleViolations(dinners.GetRuleViolations());
                }
                
            }
            return View(dinners);
        }

    基于类型来锁定绑定
    基于类型来说锁定绑定,这样一旦制定绑定规则,就可以在所有Controller和Action中使用,
    包括UpdateModel方法和Action方法的参数。 通过添加[Bind]属性到类上,或者在应用程序
    中的Global.asax文件中(如果类型不是我们自定义的情况下,非常有用),来定制类型绑定规则。
    使用Bind属性的Include和Exclude属性来指定类或接口中的那些属性是可以绑定的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq;

namespace NerdDinner.Models
{
    [System.Web.Mvc.Bind(Include="Title,Description,ContactPhone")]
    public partial class Dinners
    {
       
    }
}
 
 
原文地址:https://www.cnblogs.com/lori/p/2126365.html