我有一个动作就像这样:

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" }
       );

URL我上的是:

News.mvc/Archive/2008

我有一个形式上的这一页是这样的:

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

提交的形式应该去新闻。视/Archive/2007如果'的2007年选择的形式。

这需要形成"行动"属性"的新闻。视/存档"。

然而,如果我声明形成这样的:

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

它呈现为:

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

有人可以请让我知道我的失踪?

有帮助吗?

解决方案

你有几个问题,我想。

首先,你的路线没有默认值为"一年",因此该网址"/新闻。视/存档"实际上是无效的路由选择的目的。

第二,你在期待的形式的数值显示出来,因为路线参数,但这并不是如何HTML工作。如果你利用一个普通的形式与选择和一个提交,你的网址将最终具有"?year=2007年"在结束他们。这仅仅是如何获取方式的设计工作在HTML。

所以你需要得出一些结论是关于什么是重要的。

  • 如果你想让用户能够选择的东西从拉和改变提交的网址,那么你必须要使用Javascript实现这一点(通过拦截形式提交,并制订正确的URL)。
  • 如果你没事/新闻。视/存档?year=2007年作为你的网址,然后你应该删除的{年}指定的路线完全。你仍然可以离开"int"年度参数在您的行动,因为形式的价值也会填充的行动方法的参数。

其他提示

我想我已经工作了,为什么-路线包括{年}所以产生的路线总是会太..

如果任何人都可以证实吗?

解决方案

好吧这里是解决方案,(由于布拉德领导我那里)。

1)要求的默认值在路线:

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

2)加重定向分析获得的参数,虽然他们是URL段。

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

3)确保你有你向代码要求params 之前 任何代码,用于向"默认"年的条目。即

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

3)明确指定的默认值年在网址。RouteUrl()呼吁:

Url.RouteUrl("News-Archive", new { year = 0 })
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top