首页 > 其他分享 >MVC工作中的笔记~1(架构师是一步一步练成的)

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

时间:2022-12-12 23:05:51浏览次数:33  
标签:product name 一步 pro ProductRepository MVC new 架构师 public

如果你是一个对象MVC很痴迷但没有使用过的朋友,那你可以看这篇文章了。

1 Controller里的Create()方法, 一个用来显示VIEW,一个用来接入从VIEW提示过来的表单信息及便进行处理
public ActionResult Create()
{
product pro = new product()
{};
return View(new ProductFormViewModel(pro));
}

[AcceptVerbs(HttpVerbs.Post)]//筛选器,当有post事件时被触发
public ActionResult Create(product pro) //这才是真正的create方法
{
if (ModelState.IsValid) //验证是否有效
{
try
{
ProductRepository.Add(pro);
ProductRepository.Save();
}
catch (Exception e)
{
throw new Exception(e.Message);
}

}

return View(new ProductFormViewModel(pro));

}
2 对于View中的DropDownList的数据绑定
//首先,2010-5-14这种绑定需要返回的数据源是个SelectList,所以,我们分三层说一下
//View层代码:
<%= Html.DropDownList("typeid", Model.Type )%>
// Controller层代码
public class ProductFormViewModel
{
public product Product { get; private set; } //只能在类内部为它赋值,它对外是只读的属性
public SelectList Type { get; private set; }
public ProductFormViewModel(product _product)
{
Product = _product;
ProductController pc=new ProductController(); //从Controller中得到它的一个实例
//这名就是绑定了,首先是一个IEnumerabler的对象,后台是dropdownlist的值和文本
Type = new SelectList(pc.ProductType(),"typeid","typename");
}
}
public class ProductController : Controller
{
private Irepository ProductRepository;
public ProductController()
: this(new repository())
{
}
public ProductController(Irepository res)
{
ProductRepository = res;
}
public IEnumerable ProductType() //反回一个IEnumerable的对象
{

IEnumerable<prodcutType> pt = ProductRepository.ProductType();
return pt;
}
//MODEL层代码:
namespace MvcApplicationTester.Models
{
public class repository:Irepository
{
private DataClasses1DataContext con = new DataClasses1DataContext();

public IQueryable<prodcutType> ProductType() //返回一个linq to sql的查询表
{
return con.prodcutType;
}

}
}
3 使用方法的属生,也称筛选器,来使方法在表单提交后执行。
[AcceptVerbs(HttpVerbs.Post)]
4 页面是否被授权,如果为真,则执行方法
[Authorize]
如果授权和表单提交希望同时验证,可以这样作
[AcceptVerbs(HttpVerbs.Post), Authorize]
5 Controller中的Edit()方法,需要先用id号取出数据,并返回视图,然后第二步才是修改数据,所以Edit方法也是由两个重裁的方法组成

public ActionResult Edit(int id) //取出数据,反回视图的同时,传递回了pro这个对象
{
product pro = ProductRepository.GetProduct(id);
return View(new ProductFormViewModel((pro)));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id,FormCollection collection) //根据ID号,对表单中的数据进行update
{
product pro = ProductRepository.GetProduct(id);
try
{
UpdateModel(pro); //注意,在使用updateModel为实体赋值时,要求表单元素名称与实体的属性名称要相同才行
ProductRepository.Save();
return RedirectToAction("Details", new {id = pro.productid});
}
catch (Exception err)
{
throw new Exception(err.Message);
}
}
6 [HandleError]筛选器,页面出现错误后,它会返回一个Error.aspx的视图,它可以在类前加,也可以在方法前加

7 Trigraphs运算符:如果 ?? 运算符的左操作数非 null,该运算符将返回左操作数,否则返回右操数

8 Linq实现inner join 的效果
student[] stu = {
new student{Name="zzl", Gander="male", Age=20, Score=99,Class=1},
new student{Name = "zql", Gander = "female", Age=19,Score = 100,Class=2}
};
Classes[] cls = {
new Classes {Class = 1, ClassName = "一年级"},
new Classes {Class = 2, ClassName = "二年级"}

};
var stuName = (from students in stu
join class1 in cls on students.Class equals class1.Class
select new
{
_name=students.Name, //别名为_name
_gander=students.Gander,
_score=students.Score,
_classname=class1.ClassName
});
foreach (var name in stuName)
{
Response.Write(name._name + " " + name._gander + " " + name._score + " " + name._classname + "<hr>");
}

9 过滤器,也称为扩展方法,是对指定类型扩展添加的方法,在不改变原来类的结构,后续添加的方法
public static class CatalogFilters
{
public static Category WithCategoryName(this IList<Category> list, string categoryName)
{
return (from s in list
where s.Name.ToLower()==categoryName.ToLower()
select s).SingleOrDefault();
}
}

IList<Category> sample=数据源

sample.WithCategoryName(“zzl”); //直接就可以返回categoryName为zzl的实体对象一条

10 根据对象的构造方法的参数个数,来为类初始化值,这叫构造方法的重载
class OrderItem
{
public string ProductName{ get; set;}
public int Count(get;set;)
public OrderItem(string name) //有点意思 ,当加载同名方法时,可以根据传递的参数个数,来加载指定的构造方法,
这是重载,当然,如果希望实现对同一方法的不同功能,也可以在同名方法中,
为固定的参数直接赋这初值
: this(name,1) //当OrderItem方法只传递name参数时,它的第二个能数i被初始化为1,实事上,它只是个为类初始化的构造方法。
{
}
public OrderItem(string name,int count)
{
this.ProductName = name;
this.Count=count
} //通过实例,我们可以看到,当初始化类实例时OrderItem("梨"),这时,梨的Count就是1,
当然,如果是OrderItem("梨",2),那么Count自然就是2了
}

作者:仓储大叔,张占岭,
荣誉:微软MVP

标签:product,name,一步,pro,ProductRepository,MVC,new,架构师,public
From: https://blog.51cto.com/u_15765017/5932121

相关文章