1.1 action和method特性
表单是包含输入元素的容器,其中包含按钮、复选框、文本框等元素。表单中的这些输入元素使得用户能够向页面中输入信息,并把输入的信息提交给服务器。数据的提交依赖于action和method。
action特性用以告知Web浏览器信息发送到哪里,所以action包含一个URL。这里的URL可以是相对的,也可以使绝对的。
1 <form action="http://www.bing.com/search"> 2 <input name="q" type="text" /> 3 <input type="submit" value="Search!"> 4 </form>
上面的代码中不包含method特性。发送信息时,默认是“get”,所以上面的代码等同于:
1 <form action="http://www.bing.com/search" method="get"> 2 <input name="q" type="text" /> 3 <input type="submit" value="Search!"> 4 </form>
当用户使用HTTP GET请求提交表单时,浏览器会提取表单中输入元素的name特性值及其相应的value特性值,并将他们放入查询字符串中。换句话说,上面的表单将把浏览器导航到URL(假设用户正在搜索关键词love):http://www.bing.com/search?q=love
1.2 GET方法还是POST方法
如果不想让浏览器把输入值放入查询字符串中,而是想放入HTTP请求的主体,就可以给method特性值赋值post。尽管这样也可以成功的向搜索引擎发送POST请求并能看到响应的结果,但是相对而言,使用HTTP GET请求会更好一些。
- GET请求的所有参数都在URL中,因此可以为GET请求建立书签。可以在电子邮件或网页中将这些URL作为超链接来使用,除此之外,还可以保留所有的表单输入值。
- 更重要的是,因为GET方法代表的是幂等操作和只读操作,所以它是做这些工作的最好选择。Get不会(或不应该)改变服务器上的状态,所以客户端可以向服务器重复地发送GET请求而不会产生负面影响。
- POST请求可以用来提交信用卡交易信息、向购物车中添加或者修改密码等。POST请求通常情况下会改变服务器上的状态,重复提交POST请求可能会产生不良后果。
通常情况下,GET请求用于读操作,POST请求用于写操作(通常包括更新、创建和删除)
(1)用搜索表单搜索音乐
HTML:
1 <form action="/Home/Search" method="get"> 2 <input type="text" name="q" /> 3 <input type="submit" value="Search"> 4 </form>
在HomeController控制器中实现Search方法。
1 public ActionResult Search(string q) 2 { 3 var albums = storeDB.Albums 4 .Include("Artist") 5 .Where(a => a.Title.Contains(q)) 6 .Take(10); 7 return View(albums); 8 }
(2)通过计算action特性值来搜索音乐
更好的办法是通过计算action特性的值来搜索音乐。有一个HTML辅助方法可以代劳自动完成这个计算,如下所示:
1 @using ( Html.BeginForm("Search" , "Home" ,FormMethod.Get)) { 2 <input type="text" name="q" /> 3 <input type="submit" value="Search"> 4 }
BeginForm HTML辅助方法利用路由引擎找到HomeController控制器的Search操作。它在后台使用GetVirtualPath方法,该方法在RouteTable的Routes属性中——在global.aspx中,Web应用程序注册所有路由的位置。