九、ASP.NET MVC入门到精通——Controller(控制器)

本系列目录:ASP.NET MVC4入门到精通系列目录汇总html

Controller主要负责响应用户的输入。主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供。浏览器

  • 继承自:System.Web.Mvc.Controller
  • 一个Controller能够包含多个Action. 每个Action都是一个方法, 返回一个ActionResult实例
  • 一个Controller对应一个xxController.cs控制文件,对应在View中有一个xx文件夹。通常状况一个Action对应一个View页面

Controller Action方法参数与返回值

Action方法接收参数:
a.接收浏览器传过来的参数(get-两种格式/post)
   a1.接收FormCollection Request.Form工具

 1.经过Request.Form["name"] 逐个获取 表单提交的数据post

在View视图中url

  @Html.TextBoxFor(x => x.CusName, new { @class = "trade-timen", @id = "cusName" })<span class="wtps">* @Html.ValidationMessageFor(m => m.CusName)

控制器中spa

 [HttpPost]
public string UpdateCustomerInfo(FormCollection form)
{
return  Request.Form["CusName"];;
 }

注意:在View界面要存在name属性为CusName的表单元素,由于提交表单数据的时候,只会提交全部带name标签的数据。3d

 2.经过 FormCollection form逐个获取 表单提交的数据code

[HttpPost]
public string UpdateCustomerInfo(FormCollection form) { return form["CusName"];
}

   a2.接收Modelorm

经过 实体对象 一次性获取 表单元素的数据,并设置到实体对象对应的属性中htm

        /// <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();
        }

注意: 表单中的表单元素的属性名称必须和实体对象的属性同样!

折叠类中全部方法:ctrl+m+o 

折叠类中全部的代码块,包括类:ctrl+m+l

b.接收Get数据,Request.QueryString

直接经过请求上下文对象里的 Request获取 url ?后的的参数:

  浏览器请求路径为:/User/UserList/1?kjy=jp

  控制器获取:Request.QueryString["kjy"];

Action方法输出返回值:

b1.string:直接 返回响应报文字符串;

b2.ActionResult:返回控制器结果对象
     (里面会包含什么呢?能作什么呢?)

b3.JsonResult:返回 Json 字符串

Action的返回值-ActionResult

Action指定使用视图

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> 强类型视图页面类,而且指定TStudent
 
  

 若是没有添加@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中对应的这几个对象。

本系列目录:ASP.NET MVC4入门到精通系列目录汇总

相关文章
相关标签/搜索