MVC View中关于Request["para"]的一个现象

下面现象在MVC3.0 View C# razor IE10 chrome19中发生:

1. 当页面中有form表单且应用post协议提交数据时(如下)

        <form method="post" action="">
              第一个数字:<input type="number" name="numA" value="@Request["numA"]" /><br />
              第二个数字:<input type="number" name="numB" value="@Request["numB"]" />
          <p>和:@numC</p> 
          <input type="submit" value="计算" />

        </form>  

  对应页面可以用用C#代码Request["numA"]获取,并进行计算(如下)       

        @{
          var numC = 0.0;
          if (IsPost){
          numC = Convert.ToDouble(Request["numA"]) + Convert.ToDouble(Request["numB"]);
          }
        }

2. 此时点击“计算”按钮,提交的numA与numB通过post协议交到服务器。服务器端Request["numA']与Request["numB"]可以正常获取到数据进行运算,页面没有问题。

3. 但是如果此时自己在该网页地址栏中rul后键入  ?numA=1&numB=2并回车。  就会发现页面显示中的numA和numB改成了1 和 2,结果却为0.

  这说明:通过在地址栏键入url的方式,浏览器利用get协议提交数据,服务器端Request['numA'] 和 Request['numB']得到了数据。但因为代码中IsPost的if判断,没有对结果进行运算,保持numC为0。

4. 神奇的东西在此刻发生了,之后再利用“计算”按钮进行计算,无论填充数据是什么,页面始终保持和3步相同的结果NumA=1,numB=2,结果=0。

  后来发现,后面通过“计算”按钮的post协议的url中此时还保持着get协议时候的参数numA=1&numB=2。这是根本原因。

 

结论有三点:

  1. Request["paraName"]可以获得get协议的url参数方式传递的数据,也可以获得通过post传递的参数。

  2. 如果两种参数都有(正常情况下不存在),Request[“paraName”]优先获得第一种。

  3. 此“非正常情况”是指在post协议的url地址后面也加入参数,如上文。

  4. post协议的url也可以加入参数,甚至可以被浏览器识别。值得大家警示!(如下post协议header部分)

      POST /Home/About?numA=100&numB=30 HTTP/1.1

             Host: localhost:40377

警示:  

  1. 用mvc处理表单、参数时尽量放到control类的函数里面,而不是view中。并且做到一一对应。

  2. 对于人工加入post协议的url参数的情况,post协议是协议上不接受此情况?否则始终存在人工修改的情况。否应该做出变化,做到从

posted @ 2012-06-04 14:26  code++  阅读(546)  评论(0编辑  收藏  举报