当前位置 > 首页 > Asp.net

【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

2012-12-11 10:53:00来源:Asp.net

注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本系列教程,请先看前面的内容。

5.2 Sending HTML Form Data
5.2 发送HTML表单数据

本文引自:http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1

By Mike Wasson|June 15, 2012
作者:Mike Wasson | 日期:2012-6-15

Part 1: Form-urlencoded Data
第1部分:URL编码的表单数据

This article shows how to post form-urlencoded data to a Web API controller.
本文显示如何向Web API控制器递交URL编码的表单数据。

  • Overview of HTML Forms
    HTML表单概述
  • Sending Complex Types
    发送复合类型
  • Sending Form Data via AJAX
    通过AJAX发送表单数据
  • Sending Simple Types
    发送简单类型

Download the completed project.
下载完整的项目。

Overview of HTML Forms
HTML表单概述

HTML forms use either GET or POST to send data to the server. The method attribute of the form element gives the HTTP method:
HTML表单使用GET或POST将数据发送给服务器。form元素的method标签属性给出HTTP方法:

<form action="api/values" method="post">

The default method is GET. If the form uses GET, the form data is encoded in the URI as a query string. If the form uses POST, the form data is placed in the request body. For POSTed data, the enctype attribute specifies the format of the request body:
默认方法是GET。如果form使用GET,表单数据作为查询字符串被编码到URI中。如果form使用POST,表单数据被放在请求体中。对于POST的数据,enctype标签属性会指明请求体的格式:

enctype Description
描述
application/x-www-form-urlencodedForm data is encoded as name/value pairs, similar to a URI query string. This is the default format for POST.
表单数据被编码成“名字/值”对,类似于URI查询字符串。这是POST的默认格式。
multipart/form-dataForm data is encoded as a multipart MIME message. Use this format if you are uploading a file to the server.
表单数据被编码成多部分MIME消息。如果把文件上传到服务器,使用的是这种格式。

MIME指Multipurpose Internet Mail Extensions — 多用途互联网邮件扩展,它是通过网络传递邮件消息的一个互联网标准。MIME规定了用于表示各种数据类型的符号化方法。在HTTP协议中,对HTTP消息的内容类型也采用了MIME的这种表示数据类型的方法。上述enctype标签属性意为“编码类型”,就是用来指定HTTP消息的Content-Type(内容类型)报头属性。给这个标签属性所指定的值必须是MIME对Content-Type所规定的值之一。上表中便是MIME中关于内容类型的其中两个值。更多内容请参阅MIME的有关资料 — 译者注

Part 1 of this article looks at x-www-form-urlencoded format. Part 2 describes multipart MIME.
本文的第1部分考察x-www-form-urlencoded格式。第2部分描述多部分MIME。

Sending Complex Types
发送复合类型

Typically, you will send a complex type, composed of values taken from several form controls. Consider the following model that represents a status update:
典型地,你要发送的是一个复合类型,它由几个表单控件的值所组成。考虑以下表示状态更新的一个模型:

namespace FormEncode.Models
{
using System;
using System.ComponentModel.DataAnnotations;

public class Update
{
[Required]
[MaxLength(140)]
public string Status { get; set; }

public DateTime Date { get; set; }
}
}

Here is a Web API controller that accepts an Update object via POST.
以下是通过POST接收Update对象的一个Web API控制器。

namespace FormEncode.Controllers
{
using FormEncode.Models;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;

public class UpdatesController : ApiController
{
static readonly Dictionary<Guid, Update> updates = new Dictionary<Guid, Update>();

[HttpPost]
[ActionName("Complex")]
public HttpResponseMessage PostComplex(Update update)
{
if (ModelState.IsValid && update != null)
{
// Convert any HTML markup in the status text.
// 转换status文本中的HTML标记。
update.Status = HttpUtility.HtmlEncode(update.Status);

// Assign a new ID.
// 赋一个新的ID。
var id = Guid.NewGuid();
updates[id] = update;

// Create a 201 response.
// 创建一个201响应。
var response = new HttpResponseMessage(HttpStatusCode.Created)
{
Content = new StringContent(update.Status)
};
response.Headers.Location =
new Uri(Url.Link("DefaultApi", new { action = "status", id = id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}

[HttpGet]
public Update Status(Guid id)
{
Update update;
if (updates.TryGetValue(id, out update))
{
return update;
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
}
}

This controller uses action-based routing, so the route template is "api/{controller}/{action}/{id}". The client will post the data to "/api/updates/complex".
这个控制器使用了“基于动作的路由(本系列教程的第4.1小节 — 译者注)”,因此,路由模板是“api/{controller}/{action}/{id}”。客户端会把这些数据递交给“/api/updates/complex”。

Now let’s write an HTML form for users to submit a status update.
现在,让我们编写一个用户递交状态更新的HTML表单。

<h1>Complex Type</h1>
<form id="form1" method="post" action="api/updates/complex"
enctype="application/x-www-form-urlencoded">

&l

  • 程序员的收入和择业,也谈谈我的看法(内容很粗俗,未成年人勿入)

    2009-7-19 22:13:00

    现在院子里聊了聊大公司,小公司,择业还是创业,我书里其实专门写了一章,介绍这事,但是编辑mm看了很不喜欢,我就给删了。这发在博客园,大家看后一笑了之。 我这专门拿姑娘的事做比喻,请大家自觉对号入座吧

  • .net有没有判断字符串编码的函数

    2012-4-13 8:42:00

    public class WebGet { int m_httpCode = 0; string m_strErrMsg = ""; stri

  • 白话讲反射技术 --- 适合初学者入门引导

    2009-10-16 13:42:00

    摘要: 这篇文章就不讲废话了,反射感觉就像“动态调用”一样的意思,反射跟接口结合在一起用的情况比较多见,若接口到底是什么也没看明白,云里雾里的,反射你先别折腾了,浪费生命意义

  • Gadget开发实战总结 2 (I See Pink Problem)

    2007-9-6 19:09:00

    摘要: 在使用WebService解决了Gadget和服务端的通信问题之后,我们大部分时间都花在Gadget客户端的编写工作上。毕竟使用Gadget的一个目的就是那超炫的界面。在这其中也出现了不少的

  • MOSS 直接动态安装webPart到页面

    2007-7-5 11:37:00

    在现在开发的项目中,发现一个好玩的东西,就是动态把WebPart自动的加载到指定的页面上的指定的位置? 感觉是不是很神奇?其实也很简单,主要用到SPLimitedWebPartManager这个类就

  • DataRabbit 轻量的数据访问框架(20)-- 实时同步的实体缓存 SyncEntityCache

    2009-5-11 21:02:00

    在系统架构设计中,使用缓存是最常用的降低数据库负载和提升性能的策略,缓存的主要目的是减少对数据库的 Read 操作。但是在不同的情况下,我们需要使用不同形式的缓存。 比如,如果数据表中的数据是

  • 脑残的FtpWebRequest 2之事故现场重现

    2009-11-14 17:28:00

    阅读: 258 评论: 0 作者: 亚历山大同志 发表于 2009-11-14 14:37 原文链接 鉴于上一篇POST过于抽象以至于很多人无法理解,现在用代码来说话,我们一起来重新回顾一

  • 统一的异常捕获机制

    2009-7-17 20:12:00

    你能保证你写的程序所有异常都能捕获到嘛?程序逻辑越复杂,越有可能有些异常没有考虑到,程序遇到这些情况基本上就是异常退出,所以一个能捕获到所有异常的需求就来了,我个人认为有异常不见得都是坏事,至少我的

  • SharePoint 2007图文开发教程(3)---实现简单的WebPart

    2009-10-26 11:22:00

    阅读: 633 评论: 6 作者: GWPBrian 发表于 2009-10-26 08:13 原文链接 在前面的文章中,我们讲解了很多基础的内容,主要包括 安装配置 、简单的 创建网站

  • SSL3.0标准解析及对CSP的调用

    2009-7-5 19:12:00

    最近一直在忙活Mobile上的CSP,代码迁移完成后,在测试的过程中遇到了一些问题。 一个是由于GPRS网络不稳定,经常造成Connect失败,还有就是只含有交换密钥的数字证书无法登陆SSL服务