ASP.NET MVC 中的 RESTful 路由





4.00/5 (2投票s)
此示例应用程序演示了如何使用 SimplyRestfulRouteHandler 来提供一种 RESTful 的客户端-服务器通信方法。
引言
此示例应用程序演示了如何使用 SimplyRestfulRouteHandler
来提供一种 RESTful 的客户端-服务器通信方法。SimplyRestfulRouteHandler
包含在 MVC Contrib 项目中,该项目扩展了 ASP.NET MVC 框架的功能。
背景
MvcContrib 包含很多有用的东西。其中之一是 SimplyRestfulRouteHandler
,这是一个由 Adam Tybor 创建的路由工具。使用 SimplyRestfulRouteHandler
,可以将以下 10 个路由分配给下面的 8 个动作。
操作 | URL | HTTP 方法 | 表单方法 |
显示 | [控制器]/[id] | GET | |
Create | [控制器] | POST | |
更新 | [控制器]/[id] | PUT | |
更新 | [控制器]/[id] | POST | PUT |
Destroy | [控制器]/[id] | 删除 | |
Destroy | [控制器]/[id] | POST | 删除 |
目录 | [控制器] | GET | |
新建 | [控制器]/new | GET | |
未使用。 | [控制器]/[id]/edit | GET | |
删除 | [控制器]/[id]/delete | GET |
* 基于 Adam Tybor 网站上的信息。
路由处理程序出乎意料地易于使用,但如果您不熟悉最新 MVC 源代码更新的新方法签名,则设置起来可能很棘手。我根据 MVC HomeController 创建了此示例应用程序,该应用程序重点介绍了 SimplyRestfulRouteHandler
定义的 8 个动作。要进行操作,您需要 4/16 的 MVC 源代码更新(build 0416)和 4/19 的 MvcContrib 库 (0.0.1.101)。
Using the Code
首先,您应该从“新建项目”对话框的“我的模板”部分创建一个新的“ASP.NET MVC Web 应用程序”项目。如果您使用“Visual Studio 安装的模板”部分下同名的模板,则您将使用 MVC 的最新官方版本,而不是源代码更新。在 *global.asax.cs* 文件中,将 RegisterRoutes
方法替换为以下内容
public static void RegisterRoutes(RouteCollection routes)
{
SimplyRestfulRouteHandler.BuildRoutes(routes);
}
这将允许路由处理程序根据上表中列出的模板为您构建所有 10 个路由。
接下来,我们打开 *HomeController.cs* 文件并添加相应的动作。
public ActionResult Show(string id)
{
ViewData["Title"] = "Show";
ViewData["Message"] = "This will <em>Show</em> resource " + id;
return RenderView("Index");
}
public ActionResult Create()
{
ViewData["Title"] = "Create";
ViewData["Message"] = "This will <em>Create</em> a new resource";
return RenderView("Index");
}
public ActionResult Update(string id)
{
ViewData["Title"] = "Update";
ViewData["Message"] = "This will <em>Update</em> resource " + id;
return RenderView("Index");
}
public ActionResult Destroy(string id)
{
ViewData["Title"] = "Destroy";
ViewData["Message"] = "This will <em>Destroy</em> resource " + id;
return RenderView("Index");
}
public ActionResult Index()
{
ViewData["Title"] = "Index";
ViewData["Message"] = "This is the <em>Index</em>";
return RenderView("Index");
}
public ActionResult New()
{
ViewData["Title"] = "New";
ViewData["Message"] = "This will create a <em>New</em> resource";
return RenderView("Index");
}
public ActionResult Edit(string id)
{
ViewData["Title"] = "Edit";
ViewData["Message"] = "This will <em>Edit</em> resource " + id;
return RenderView("Index");
}
public ActionResult Delete(string id)
{
ViewData["Title"] = "Delete";
ViewData["Message"] = "This will <em>Delete</em> resource " + id;
return RenderView("Index");
}
对于此示例应用程序,我们真正想做的只是简单地显示一条简短消息,告知用户想要执行哪个动作。生成的“*Index.aspx*”视图对于此操作非常适合,因此我们可以将 RenderView()
方法的 viewName
参数设置为“Index”用于所有动作,如上所示
现在,我们几乎拥有了所需的一切。让我们继续在“Site.Master”文件中,并使用户能够通过点击事件生成所有 8 个动作。
<ul id="menu">
<li> <%= Html.ActionLink("Show GET", "Show", "Home", new { @id="1" }) %> </li>
<li> <%= Html.ActionLink("Index GET", "Index", "Home")%> </li>
<li> <%= Html.ActionLink("New GET", "New", "Home")%> </li>
<li> <%= Html.ActionLink("Edit GET", "Edit", "Home", new { @id = "1" })%> </li>
<li> <%= Html.ActionLink("Delete GET", "Delete", "Home", new { @id = "1" })%> </li>
<li>
<form action="<%= Url.Action("Create", "Home") %>" method="post" >
<a onclick="parentNode.submit();">Create POST</a>
</form>
</li>
<li>
<form action="<%= Url.Action( "Update", "Home", new { @id = "1" }) %>"
method="post" >
<input type="hidden" name="_method" value="put" />
<a onclick="parentNode.submit();">Update POST</a>
</form>
</li>
<li>
<form action="<%= Url.Action( "Destroy", "Home", new { @id = "1" }) %>"
method="post" >
<input type="hidden" name="_method" value="delete" />
<a onclick="parentNode.submit();">Destroy POST</a>
</form>
</li>
</ul>
如果您仔细观察,您应该注意到 POST 事件有一个隐藏的输入元素,名为“_method
”,其值为 HTTP 方法(PUT 或 DELETE)。好吧,大多数浏览器不支持这两种方法,因此我们有时需要一种巧妙的方法来启动这些请求。Adam 很好心地将我们的 Destroy 和 Update 动作连接起来,以便当路由管理器接收到标准的 HTTP PUT 和 DELETE 方法时或当它接收到浏览器友好的 HTTP POST 请求并定义了 PUT 或 DELETE "_method" 时,它们会触发。接下来,我们需要使菜单的表单元素看起来漂亮,因此我们在“*Site.css*”文件中添加以下内容。
ul#menu li form
{
display: inline;
list-style: none;
}
就是这样了。您应该能够启动应用程序并单击所有菜单项以生成 8 个 RESTful 动作中的任何一个。
历史
- 2008 年 5 月 26 日:创建文章。
- 2008 年 5 月 30 日:使用所有 Action 的“Index”视图名称简化了源代码。