zoukankan      html  css  js  c++  java
  • 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了

  • 相关阅读:
    工作中遇到的java 内存溢出,问题排查
    java线上内存溢出问题排查步骤
    性能测试-java内存溢出问题排查
    164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法
    163 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 03 使用多重catch结构处理异常
    162 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 02 使用try-catch结构处理异常
    161 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 01 try-catch-finally简介
    160 01 Android 零基础入门 03 Java常用工具类01 Java异常 03 异常处理简介 01 异常处理分类
    159 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 02 异常分类
    158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?
  • 原文地址:https://www.cnblogs.com/chsword/p/mvc1_10.html
Copyright © 2011-2022 走看看