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协议是协议上不接受此情况?否则始终存在人工修改的情况。否应该做出变化,做到从