ASP.NET MVC 重点教程一周年版 第十回 请求Controller

    其实我们通常遇到的请求方式无非get/post,但是有很多Web开发人员仍然对二者分不清。

    get即通过URL中的QueryString向服务器端传值的方式,它的数据是可见的,可post则是通过一个postdata包向服务器传值,post方式可以传送更多数据(如上传文件),也更安全(如登录)。

    本文将演示各种通过客户端页面(即最终生成的页面)向Controller提交请求以及在Controller中接受的方式。

约定

    本文所有的示例都将是演示一个登录过程,但并不关注判断过程,所以判断方面仅做简单的IF操作。

    而提交的实体我们新建一个Account类。

它的内容如下:

   1: /// <summary>
   2:  /// 用户账户的实体类
   3:  /// </summary>
   4:  public class Account {
   5:      /// <summary>
   6:      /// 用户名
   7:      /// </summary>
   8:      public string UserName { get; set; }
   9:      /// <summary>
  10:      /// 密码
  11:      /// </summary>
  12:      public string Password { get; set; }
  13:  }

文中大多数示例使用了Account类,但并不是所有的示例都使用了Account。

在文中我们并不关注提交信息的页面的Controller,仅关注处理信息的Controller。

而Controller中存在这样一个方法,用于辅助判断:

   1: /// <summary>
   2: /// 一个辅助判断的方法
   3: /// </summary>
   4: /// <param name="userName">用户名</param>
   5: /// <param name="password">密码</param>
   6: /// <returns></returns>
   7: string AreEquals(string userName,string password)
   8: {
   9:     return (userName.ToLower() == "admin" && password == "123456").ToString();
  10: }

以Post提交的数据来看传递

    之所以这里先说Post是因为相对于Get方式来说Post的情况更全,说明了Post的情况Get也就差不多了。

View:

   1: <%using (Html.BeginRouteForm(new { controller = "home", action = "process" })) {%>
   2: <p>
   3:     <label>用户名:</label><%=Html.TextBox("username") %></p>
   4: <p>
   5:     <label>密码:</label><%=Html.TextBox("password") %></p>
   6: <p>
   7:     <input type="submit" /></p>
   8: <%
   9:     }%>

1.从最基本的开始,使用Request获取提交的信息

 

 

   1: /// <summary>
   2: /// 处理请求的Action 
   3: /// </summary>
   4: /// <returns></returns>
   5: public ActionResult Process()
   6: {
   7:     return Content(
   8:         AreEquals(Request.Form["username"], Request.Form["password"])
   9:         );
  10: }

    这个无多解释,通过Request.Form来获取表单提交我想是最基本的方法之一,如果您对这种方法不了解的话,那么就说明您的ASP.NET基础有待提交,可以查看ASP.NET五大对象的相关文章。

2.通过Action参数提交

相比之下这个可能更加漂亮些。

   1: /// <summary>
   2: /// 处理请求的Action 
   3: /// </summary>
   4: /// <param name="userName">这两个参数务必与表单中的名称一致</param>
   5: /// <param name="password"></param>
   6: /// <returns></returns>
   7: public ActionResult Process(string userName, string password)
   8: {
   9:     return Content(
  10:         AreEquals(userName, password)
  11:         );
  12: }

3.UpdateModel来获取传递

   1: /// <summary>
   2: /// 处理请求的Action 
   3: /// </summary>
   4: /// <returns></returns>
   5: public ActionResult Process()
   6: {
   7:     var a = new Account();
   8:     UpdateModel(a);//确定a包含Password及UserName这两个属性即可,否则抛出异常
   9:     return Content(
  10:         AreEquals(a.UserName, a.Password)
  11:         );
  12: }

当然我们这里很容易出现异常所以可以使用另一个方法来替代,TryUpdateModel:

   1: /// <summary>
   2: /// 处理请求的Action 
   3: /// </summary>
   4: /// <returns></returns>
   5: public ActionResult Process()
   6: {
   7:     var a = new Account();
   8:     //这样就可以在没有成功转换时使用另一种处理方式
   9:     return Content(
  10:         TryUpdateModel(a))?AreEquals(a.UserName, a.Password):bool.FalseString
  11:         );
  12: }

上面这种UpdateModel的方法已经很简单了,可是ASP.NET MVC为我们提供了更简单的方式:

4.使用绑定

   1: /// <summary>
   2: /// 处理请求的Action 
   3: /// </summary>
   4: /// <returns></returns>
   5: public ActionResult Process(Account a)
   6: {
   7:     return Content(
   8:         AreEquals(a.UserName, a.Password)
   9:         );
  10: }

就是这么简单

 

可能存在的问题

我们在提交表单时可能有多个Account对象,这种情况下我们应该怎么办呢。

请看下面:

View:

   1: <%using (Html.BeginRouteForm(new { controller = "home", action = "process" })) {%>
   2: <p>
   3:     <label>用户名1:</label><%=Html.TextBox("a.username") %></p>
   4: <p>
   5:     <label>密码1:</label><%=Html.TextBox("a.password") %></p>
   6:        <p>
   7:     <label>用户名2:</label><%=Html.TextBox("b.username") %></p>
   8: <p>
   9:     <label>密码2:</label><%=Html.TextBox("b.password") %></p>
  10: <p>
  11:     <input type="submit" /></p>
  12: <%
  13:     }%>

注意这里的表单元素的Name、

下面是处理的Action代码:

   1: /// <summary>
   2:  /// 处理请求的Action 
   3:  /// </summary>
   4:  /// <returns></returns>
   5:  public ActionResult Process(Account a ,Account b)
   6:  {
   7:   //处理代码
   8:      return View();
   9:  }

这就一切OK了

时间: 2024-08-19 15:01:18

ASP.NET MVC 重点教程一周年版 第十回 请求Controller的相关文章

ASP.NET MVC重点教程一周年版 第十回 请求Controller

其实我们通常遇到的请求方式无非get/post,但是有很多Web开发人员仍然对二者分不清. get即通过URL中的QueryString向服务器端传值的方式,它的数据是可见的,可post则是通 过一个postdata包向服务器传值,post方式可以传送更多数据(如上传文件),也更安全(如登录 ). 本文将演示各种通过客户端页面(即最终生成的页面)向Controller提交请求以及在 Controller中接受的方式. 约定 本文所有的示例都将是演示一个登录过程,但并不 关注判断过程,所以判断方面

ASP.NET MVC 重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传

母版页(Master) 1.母版页是与Controller无关的,母版页只是一个View文件,而没有任何Controller与之相对应. 2.其实在ASP.NET MVC中View的aspx与母版页并不像WebForm中那样紧密关联. 例如我想更换一个aspx的母版页,只要在Action中return 时指定所要使用的Master即可: 如图我有2个Master文件,而/Views/Home/Index.aspx则为 这时我们如果想要使用Site2做为Master,只要在Action中retur

ASP.NET MVC重点教程一周年版 第十一回 母版页、用户自定义控件及文件上传

母版页(Master) 1.母版页是与Controller无关的,母版页只是一个View文件,而没有任 何Controller与之相对应. 2.其实在ASP.NET MVC中View的aspx与母版页并不像WebForm中 那样紧密关联. 例如我想更换一个aspx的母版页,只要在Action中return 时指定所要使用 的Master即可: 如图我有2个 Master文件,而/Views/Home/Index.aspx则为 这时我们如果想要使用Site2做为Master,只要在Action中r

ASP.NET MVC重点教程一周年版 第八回 Helper之演化

凡事出现必有原因 就像Filter,它是为了解决在一类的Action之前或之后执行统一的代码而产生的. 而Helper则是为了方便View的开发而产生的. 下面我们来解决几个问题,来看看Helper是怎么演化出来的. 起 题目:如何在View中写一个超级连接连接到主页? 这个问题看起来很好回答: <a href="/home/index">首页</a> 承 其实上面这种不能称之为方案的写法其实是最好的,没有调用任何的方法,仅用纯的HTML就解 决了问题. 但是如

ASP.NET MVC重点教程一周年版 第七回 UrlHelper

这节讲 一下ASP.NET MVC中的Helper. 何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组. 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢? 其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View(还可以扩展出来 很多),在扩展包中,也有Castle的NVelocity引擎和Boo,以及ViewSpark的页面. 所以,如果在Aspx中定义方法的话会影响其扩展性和可移植性.

ASP.NET MVC重点教程一周年版 第六回 过滤器Filter

在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用 户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或 它的Controller). Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和 void OnActionE

ASP.NET MVC重点教程一周年版 第三回 Controller与View

这节我们让ASP.NET MVC真正的跑起来 一.新建Controller 首先我们自己新建一 个新的Controller在Controllers上点右键,添加,Controller选项 之后出现一个对话框: 这里我们将 之起名为EiceController 附注一下,这里是个纯广告,无兴趣可略过此行:www.eice.com.cn 为您建立Web2.0社交网站 默认生成的代码如下: //记不记得前面讲过的,所有 Controller都要继承于Controller类 public class E

ASP.NET MVC 重点教程一周年版 第六回 过滤器Filter

在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置  实现动态Action Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller). Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和 void OnActionEx

ASP.NET MVC 重点教程一周年版 第七回 UrlHelper

这节讲 一下ASP.NET MVC中的Helper. 何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组. 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢? 其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View(还可以扩展出来很多),在扩展包中,也有Castle的NVelocity引擎和Boo,以及ViewSpark的页面. 所以,如果在Aspx中定义方法的话会影响其扩展性和可移植性.而