很久以前,刚刚接触ASP.NET MVC的时候,学习笔记
View代码如下
<div> <form method="get" action="/Home/GetIndexArg"> <input name="tg" type="text" value="1" /> <input name="tg" type="text" value="2" /> <input name="tg2" type="text" value="3" /> <input type="submit" value="提交" /> </form> </div>
![]()
点完提交之后,页面传递参数是 /Home/GetIndexArg?tg=1&tg=2&tg2=3
会将Name相同的两个元素的值分别用 & 连接,而不是上次我认为的自动用 , 分隔
Controller代码如下
public void GetIndexArg(string c)//此处可以随便写参数,如果没有传过来值,就会是一个null
{
string tg = Request.Params["tg"]; //用一个String接受两个相同Name的表单元素会自动用 , 隔开 例如此处会是 tg=1,2
//string[] tg1 = Request.Params["tg"]; 编译不通过,提示无法将String转换为String[]
string tg2 = Request.Params["tg2"];
}
[HttpPost] //如果不加这个,提交表单之后,会提示请求页面不明确。(两个GetIndexArg方法),就意思不会根据传递的参数多少自动重载
public void GetIndexArg(string tg2, string[] tg) //这里可以用数组接受
{ //如果用这个方法接受参数,tg数组将有两项
//如果这个方法列表里写一个String接收相同Name的表单元素的话,只能接收到第一个Name元素值
}总结:如果元素有相同的name,通过表单提交之后,参数会是name=value&name=value2的方式提交,而不是开始认为的name=value,value2 这种方式
这种情况的话,可以在参数列表中用数组接收(不能在方法里写,原因上面 第3个 注释 有),也可以在方法里用Request.Params的方式接受,那么系统会自动封装成用 , 隔离的参数(上面第二个注释)
但是用字符串接受的话,不能再参数列表中写,如果这样的话,就会只接收到排在前面的那个参数的值。
还有一点,就是如果方法里有两个同名方法,系统不会根据参数的多少而去自动重载某个方法,当然可以用特性来标识
如果在参数列表中写了无法接收到数据的参数,那么会赋值为null,这也解释了上面的意思,因为写多少个参数都无所谓,所以不会重载啦。
好了,写到这吧 比较清晰了,起码自己有一天再看的话能完全看懂,哈哈