Controller主要负责响应用户的输入。主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供。
Action方法接收参数:
a.接收浏览器传过来的参数(get-两种格式/post)
a1.接收FormCollection Request.Form
1. 通过 Request.Form["name"] 逐个获取 表单提交的数据
在View视图中
@Html.TextBoxFor(x => x.CusName, new { @class = "trade-timen", @id = "cusName" })<span class="wtps">* @Html.ValidationMessageFor(m => m.CusName)
控制器中
[HttpPost]
public string UpdateCustomerInfo(FormCollection form)
{
return Request.Form["CusName"];;
}
注意:在View界面要存在name属性为CusName的表单元素,因为提交表单数据的时候,只会提交所有带name标签的数据。
2. 通过 FormCollection form逐个获取 表单提交的数据
[HttpPost]
public string UpdateCustomerInfo(FormCollection form) { return form["CusName"];
}
a2.接收Model
通过 实体对象 一次性获取 表单元素的数据,并设置到实体对象对应的属性中
/// <summary>
/// 修改客户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public ActionResult UpdateCustomer(CustomerInfo info)
{
string msg = string.Empty;
if (ModelState.IsValid)
{
try
{
CustomerInfo model = CustomerInfo.Load(info.ID);
model.CusCode = info.CusCode;
model.CusName = info.CusName;
model.Phone = info.Phone;
model.Tel = info.Tel;
model.Email = info.Email;
model.Fax = info.Fax;
model.Country = info.Country;
model.Address = info.Address;
model.CompanyName = info.CompanyName;
model.BusssinessType = info.BusssinessType;
model.Status = info.Status;
model.Update();
msg = "修改客户成功。";
}
catch (Exception ex)
{
msg = "修改客户失败!" + ex.Message;
ViewBag.Msg = string.Format(message, msg, false, "1");
}
ViewBag.Msg = string.Format(message, msg, true, "0");
}
return View();
}
注意: 表单中的表单元素的属性名称必须和实体对象的属性一样!
折叠类中所有方法: ctr l+m+o
折叠类中所有的代码块,包括类:ctrl+m+l
b.接收Get数据,Request.QueryString
直接通过请求上下文对象里的 Request 获取 url ? 后的的参数:
浏览器请求路径为: /User/UserList/1?kjy=jp
控制器获取:Request.QueryString["kjy"];
b1.string:直接 返回响应报文字符串;
b2.ActionResult:返回控制器结果对象(里面会包含什么呢?能做什么呢?)
b3.JsonResult:返回 Json 字符串
public ActionResult Index() { return View();//默认情况下不给参数返回和方法同名的视图,即使用视图 Index.cshtml 路径在当前控制器对应的View目录下面 return View("OtherIndex");//使用 OtherIndex.cshtml return View("~/Views/Home/Test.cshtml"); }
Controller是如何向View进行数据传输的呢?
ViewData/ViewBag/TempData/Model
我们先来看下示例
控制器代码:
public ActionResult Index() { ViewBag.UserName = "小李飞刀"; ViewData["UserName"] = "陆小凤"; TempData["UserName"] = "楚留香";//临时数据 User model = new User { UserName = "谢晓峰" }; return View(model); //这行代码其实就相当于ViewData.Model=model }
View代码:
@{ ViewBag.Title = "Index"; } <div>@ViewBag.UserName </div> <div>@ViewData["UserName"] </div> <div>@TempData["UserName"] </div> <div>@Model.UserName</div>
Model其实就是ViewData.Model
大家可能觉得这十分显而易见,结果肯定是
小李飞刀
陆小凤
楚留香
谢晓峰
可是,我要告诉你,结果并不是像你想象的那样,而是会显示为这样:
陆小凤
陆小凤
楚留香
谢晓峰
为什么呢?因为ViewData 和 ViewBag 本质上都是【 ViewDataDictionary】类型,并且两者之间的数据共享,只不过提供了不同的语法操作方式而已。
所以“陆小凤”覆盖了原先的值”小李飞刀“。
TempData,看名称我们就知道,只用来临时存储的,存储一次就失效了,不会再共享啊什么的。
打开我一直吐血推荐的犀利工具Reflector,我们来看下源码
我们看到HomeController : Controller,public abstract class Controller : ControllerBase
发现,只要从TempData 中取出一个元素,就会立即将此元素移除!
Model 强类型参数
在控制器里的Action 方法最后 调用 View 加载视图的时候,将 数据对象传入。
return View(model);
视图中,可以通过 Model 属性获取!并且不需要转型就可以直接使用!
注意: Model 虽然可以不转型就直接使用,但是 因为编译器无法在编译时获取它的类型,所以就无法出现智能提示!为了解决这个问题,我们可以在试图的最上面通过代码指定 model 类型
查看源码:
当我们在试图上添加了 @model指令时
当前视图就会继承于 WebViewPage<T> 强类型视图页面类,并且指定T为Student:
如果没有添加@model 指令: 当前视图就会继承于 WebViewPage<T> 强类型视图页面类,但 T 变成了 dynamic
到这里,Controller的数据怎么就传到View了,我明明只给Controller中的ViewData/ViewBag/TempData/赋值了,或者只把对象传给了View方法。
为什么View中就可以直接调用了呢?我们知道以前的ASP.NET,aspx和aspx.cs是一个继承关系,子类可以直接调用父类的属性方法。你ASP.NET MVC中View和Controller之间又有什么关系呢?
View和Controller中都有ViewData/ViewBag/TempData这几个对象,在给Controller中这些对象赋值后,Controller会把这些值赋值給View中对应的这几个对象。