今天遇到两个问题,第一个是跨controller传值,后一个是比较简单的linq数据库查询问题。先描述以下问题我有一个入库单和一个入库明细,入库的逻辑是先填写入库单在填入库明细。两者要么同时完成,要么都不完成。如果未完成写入数据库的数据要删除。当然尼你可以中途取消这次入库。因此为了实现这个功能加了一个链接
@Html.ActionLink("取消该入库单", "Cancel", "CancelStoreInForm"),
CancelStoreInForm是控制器名称,Cancel是控制器中处理的相应函数名。首先分析了一下要么在填入库单时就取消,要么在填入库明细时取消。前者数据没有保存到数据库,不用做任何操作。而后者入库单已经保存到了数据库,需要删除数据。
对于在填入库明细时因为之前的入库单已经保存到了数据库,此时要取消入库就的得删除入库单的数据。问题来了,删哪一条数据?这期间就需要数据传递然而入库单和入库明细有由两个不同的控制器控制。一,从入库单的视图传递入库单号到入库明细控制器。二,直接从入库单控制器传数据单入库明细控制器。经过查阅网上一些资料知道视图控制器之间传递数据有以下三种方式(http://blog.sina.com.cn/s/blog_687960370101cfjh.html):
只能在一个动作方法中设置,在相关的视图中获取,只对当前视图有效。相当于ViewState
使用方法:
Action中:ViewData["test"] = "test";
视图中:@Html.Encode(ViewData["test"])
在mvc3中已经用ViewBag替代ViewData:
Action中:ViewBag.Test= "test";
视图中:@Html.Encode("Test" )
2、TempData
可以在多个方法或者多个页面中设置、读取。TempData只能在控制器中传递一次,每个元素只能被访问一次,访问后被删除。
TempData实质上是保存在session中,每次读取都是从session中获取并删除。
使用方法:
Action中:TempData["TMessage"] = "测试TempData";
视图中:@TempData["TMessage"]
3、model传递(强类型传递)
model传递数据可以解决强类型数据传递。通过view()方法传递实例化对象到视图中。
Action中:var model = new uerList {new user{name ="name1",age="12"},new user{name="name2",age="23"}};
return View(model);
视图中:@using ~.Models.user 或者@model ~.Models.user
@ foreach( var item in Model ){
@item.name @item.age
}
PS:
传递多个数据对象的方法:
创建一个类,将多数据组合进新类中,在model中传递新类的实例即可。
Model中:public class NewClass{
public Name names{get;set;}
public Saly salys{get;set;}
}
Action中: NewClass nc = new NewClass();
nc.names= userlist;
nc.salys = salysList;
return View(nc);
视图中:@model ~.Models.NewClass
@ foreach( item in model.names) {
@item.~
}
最终经过尝试使用TempData["informno"]这种方法可行,该方法可以控制器向视图传递数据,控制器向控制器传传递数据。
还有一个linq小问题
var storein= db.aaa.SingleOrDefault(a => a.kkk == informno);//查不到可以为空
var storein= db.aaa.Single(a => a.kkk == informno);//必须有唯一的数据,否则引发异常。