ASP.NET MVC预览4 - 使用现有参数停止Url.RouteUrl()等

Mat*_*ell 5 c# forms asp.net-mvc routing

我有这样的动作:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}
Run Code Online (Sandbox Code Playgroud)

有这样的路线:

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

我所在的网址是:

News.mvc/Archive/2008
Run Code Online (Sandbox Code Playgroud)

我在这个页面上有一个表格,如下所示:

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>
Run Code Online (Sandbox Code Playgroud)

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

这要求"action"属性为"News.mvc/Archive".

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

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">
Run Code Online (Sandbox Code Playgroud)

它呈现为:

<form method="get" action="/News.mvc/Archive/2008">
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*son 2

我认为你有几个问题。

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

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

因此,您需要就什么是重要的做出一些结论。

  • 如果您希望用户能够从下拉列表中选择某些内容并更改提交 URL,那么您将必须使用 Javascript 来实现此目的(通过拦截表单提交并制定正确的 URL)。
  • 如果您同意 /News.mvc/Archive?year=2007 作为您的 URL,那么您应该从路由中完全删除 {year} 指示符。您仍然可以在操作中保留“intyear”参数,因为表单值也将填充操作方法参数。