读保哥《ASP.NET MVC2开发实战》第三回(Controller2)
区分ViewData和TempData:
viewdata属性是一个ViewDataDictionary类,这里就不介绍了;
用法:
Controller代码:
public ActionResult Index()
{
ViewData["name"]="王贺";
return View();
}
View代码:
<%:ViewData["name"]%>//这行代码就引用了{ViewData["name"]="王贺";}便把“王贺”显示出来了;
TempData:
这个就特了,用法跟ViewData一样,但TempData只在浏览器执行一次就没了,当你再去刷新的话就没了(好神奇噢!!!),所以他只是暂存,暂存多久呢,保哥说是“一次网页请求”。
模型绑定
再来讨论一下模型绑定这个问题(其实在第一个项目中已经涉及到了这个问题),在这就好好了解了解
(1)简单绑定:
View:
<%:Html.TextBox("uname")%>
<%:ViewData["name"]%>//获取Controller的ViewData
Controller:
public ActionResult Index(string name)
{
ViewData["name"]=name;//接收从View传来的参数Html.TextBox("uname"),在这里的name就是<input type="TextBox" name="uname">中name的属性uname传到了服务器;
return View();
}
如果写成webform的话就是这种:
text.htm:
<form action="Index.aspx" >
<input type="TextBox" name="uname">
<input type="submit" value="submit"/>
</form>
Index.aspx:
Request.Form["uname"];
这种绑定还有另一种方法;
MVC提供了FormCollection类;
Controller还可以这么写:
public ActionResult Index(FormCollection form)
{
ViewData["name"]=form["uname"];
return View();
}
(2)复杂绑定(利用类来绑定,类似于ADO.NET的强类型)
例如:有三个元素,Name,Email,Message
那就定义一个类:
Class Msg
{
public Name{get;set;}
public Email{get;set; }
public Message {get;set;}
}
View:
<%:Html.TextBoxFor(x=>x.Name)%>
<%:Html.TextBoxFor(x=>x.Email)%>
<%:Html.TextBoxFor(x=>x.Message)%>
<%:ViewData["name"]%>
<%:ViewData["Email"]%>
<%:ViewData["Message"]%>
Controller:
public ActionResult Index(Msg msg)//调用类Meg
{
ViewData["name"]=msg.Name;
ViewData["Email"]=msg.Email;
ViewData["Message"]=msg.Message;
return View();
}
(3)多个复杂模型绑定
<input type="TextBox" name="form1.Name"/>
<input type="TextBox" name="form1.Email"/>
<input type="TextBox" name="form1.Message"/>
<input type="TextBox" name="form2.Name"/>
<input type="TextBox" name="form2.Email"/>
<input type="TextBox" name="form2.Message"/>
Controller:
public ActionResult Index(Msg form1,Msg form2)//调用类Meg
{
ViewData["form1.name"]=form1.Name;
ViewData["form2.name"]=form2.Name;
return View();
}
(4)利用bind属性来限制更新元素:
当你来提交表单中的元素,有些元素你不行提交到数据库,你就可以通过Bind属性来限制:
public ActionResult Index([Bind(Exclude="Name")]Msg msg)//这样就可以限制name的绑定
{
}
public ActionResult Index([Bind(include="Email,Message")]Msg msg)//这样就可以限制name的绑定
{
}
也可以在类中定义:
[Bind(Include="Email,Message")]
Class Msg
{
public Name{get;set;}
public Email{get;set; }
public Message {get;set;}
}
今天暂时就写到这吧