5

我有这样的动作:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}

使用这样的路线:

routes.MapRoute(
           "News-Archive",                                              
           "News.mvc/Archive/{year}",                           
           new { controller = "News", action = "Archive" }
       );

我所在的网址是:

News.mvc/Archive/2008

我在这个页面上有一个这样的表格:

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>

如果在表单中选择了“2007”,则提交表单应转到 News.mvc/Archive/2007。

这要求表单“action”属性为“News.mvc/Archive”。

但是,如果我声明这样的表格:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

它呈现为:

<form method="get" action="/News.mvc/Archive/2008">

有人可以让我知道我错过了什么吗?

4

3 回答 3

2

你有几个问题,我想。

首先,您的路由没有“年份”的默认值,因此 URL“/News.mvc/Archive”实际上对于路由目的无效。

其次,您希望表单值显示为路由参数,但这不是 HTML 的工作方式。如果您使用带有选择和提交的普通表单,您的 URL 最终将在它们的末尾带有“?year=2007”。这就是 GET 方法表单被设计为在 HTML 中工作的方式。

所以你需要对什么是重要的做出一些结论。

  • 如果您希望用户能够从下拉列表中选择某些内容并更改提交 URL,那么您将不得不使用 Javascript 来实现这一点(通过拦截表单提交并制定正确的 URL)。
  • 如果您可以将 /News.mvc/Archive?year=2007 作为您的 URL,那么您应该从路由中完全删除 {year} 指示符。您仍然可以在您的操作中保留“int year”参数,因为表单值也会填充操作方法参数。
于 2008-09-08T05:25:58.417 回答
0

我想我已经弄清楚了原因 - 路线包括 {year} 所以生成的路线也总是会......

如果有人可以证实这一点?

于 2008-09-08T05:38:03.053 回答
0

解决方案

好的,这是解决方案,(感谢布拉德带我去那里)。

1)在路由中需要默认值:

routes.MapRoute(
       "News-Archive",                                              
       "News.mvc/Archive/{year}",                           
       new { controller = "News", action = "Archive", year = 0 }
   );

2) 添加重定向以解析 GET 参数,就好像它们是 URL 段一样。

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
}

3) 确保在重定向“默认”年份条目的任何代码之前有您的请求参数的重定向代码。IE

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
   if (year == 0)
   {
       /* ... */
   }
   /* ... */
}

3) 在 Url.RouteUrl() 调用中明确指定年份的默认值:

Url.RouteUrl("News-Archive", new { year = 0 })
于 2008-09-08T06:09:23.367 回答