Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC预览4-使用现有参数停止Url.RouteUrl()等_C#_Asp.net Mvc_Forms_Routing - Fatal编程技术网

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”参数,因为表单值也将填充操作方法参数

我想我已经找到了原因-路线包括{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()调用中显式指定年份的默认值:


在正确的轨道上。有关更多详细信息,请参见编辑相关评论。