C# ASP.NET MVC预览4-使用现有参数停止Url.RouteUrl()等
我有这样一个动作:C# ASP.NET MVC预览4-使用现有参数停止Url.RouteUrl()等,c#,asp.net-mvc,forms,routing,C#,Asp.net Mvc,Forms,Routing,我有这样一个动作: public class News : System.Web.Mvc.Controller { public ActionResult Archive(int year) { / *** / } } routes.MapRoute( "News-Archive", "News.mvc/Archive/{
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" }
);
<form>
<select name="year">
<option value="2007">2007</option>
</select>
</form>
<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">
用这样的路线:
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" }
);
<form>
<select name="year">
<option value="2007">2007</option>
</select>
</form>
<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">
我所在的URL是:
News.mvc/Archive/2008
我在这页上有这样一个表格:
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" }
);
<form>
<select name="year">
<option value="2007">2007</option>
</select>
</form>
<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">
2007
如果表单中选择了“2007”,则提交表单应转到News.mvc/Archive/2007
这要求表单“action”属性为“News.mvc/Archive”
但是,如果我声明这样的表单:
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" }
);
<form>
<select name="year">
<option value="2007">2007</option>
</select>
</form>
<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">
它呈现为:
<form method="get" action="/News.mvc/Archive/2008">
有人能告诉我我缺少什么吗?我想你有几个问题 首先,您的路由没有“年”的默认值,因此URL“/News.mvc/Archive”实际上对于路由目的无效 其次,您希望表单值显示为路由参数,但HTML不是这样工作的。如果您使用带有选择和提交的普通表单,您的URL最后将显示“?year=2007”。这就是GET方法表单在HTML中的工作方式 所以你需要得出一些关于什么是重要的结论
- 如果您希望用户能够从下拉列表中选择更改提交URL的内容,那么您必须使用Javascript来实现这一点(通过截取表单提交并制定正确的URL)
- 如果您同意将/News.mvc/Archive?year=2007作为您的URL,那么您应该完全从路由中删除{year}指示符。您仍然可以在操作上保留“int year”参数,因为表单值也将填充操作方法参数
如果有人能证实这一点?解决方案 好的,这是解决方案,(感谢Brad带领我做到这一点) 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) 确保在任何重定向“默认”年份条目的代码之前,您有请求参数的重定向代码。i、 e
public ActionResult Archive(int year)
{
if (!String.IsNullOrEmpty(Request["year"]))
{
return RedirectToAction("Archive", new { year = Request["year"] });
}
if (year == 0)
{
/* ... */
}
/* ... */
}
3) 在Url.RouteUrl()调用中显式指定年份的默认值:
在正确的轨道上。有关更多详细信息,请参见编辑相关评论。