65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中的 RESTful 路由

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2008年5月26日

MPL

3分钟阅读

viewsIcon

44269

downloadIcon

276

此示例应用程序演示了如何使用 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”视图名称简化了源代码。
© . All rights reserved.