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


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

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

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

    约定

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

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

    image

    它的内容如下:

       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:     }%>

    image

    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对象,这种情况下我们应该怎么办呢。

    请看下面:

    image

    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了

  • 相关阅读:
    分布式事务-第一刀
    Qt
    自描述C++部分面试题集
    读书笔记6.21
    STL vector容器 和deque容器
    C++ STL框架
    C++ 多态
    C++ 虚继承
    C++ 类的继承和派生
    C++ 类中的函数重载
  • 原文地址:https://www.cnblogs.com/cxd4321/p/1565414.html
Copyright © 2020-2023  润新知