使路由参数实际出现在地址栏中



我在MVC 3中有一个小应用。
在这个小应用程序中,我希望我的url非常清晰和一致。

只有一个控制器,一个动作,一个参数。
如果没有提供任何值(即浏览器请求/),则显示一个表单来收集该值。如果提供了一个值,则呈现一个页面。

唯一的路由是:

routes.MapRoute(
  "Default",
  "{account}",
  new { controller = "Main", action = "Index", account = UrlParameter.Optional }
);

这一切都工作得很好,但是account参数从未作为URL的一部分出现在地址行中。我可以手动输入test.com/some_account,它将工作,但除此之外,account作为post参数,因此不会出现。如果我在我的表单中使用FormMethods.Get,我得到?account=whatever附加到URL,这也不是我想要的,这违背了我的理解。我的理解是,MVC框架会尝试使用路由中设置的参数,只有在没有找到的情况下,它才会将它们附加在?之后。

我尝试了不同的路由设置方式——一条路由带默认参数,一条路由带必选参数,或者两条路由(一条带必选参数,一条不带参数);我已经尝试混合HttpGet/HttpPost在所有可能的方式;我试过使用可选参数string account = null的单动作方法,并使用两个动作方法(一个带参数,一个没有),但我根本无法得到的东西出现在URL。

我也参考了Steven Sanderson关于MVC 3的书,但是在屏幕截图上也没有参数(Kayak的详细信息页面显示,但地址栏中的URL是htpp://localhost:XXXX/)。

唯一确定有效且符合我要求的是

return RedirectToAction("Index", new { account = "whatever" });

但是为了做到这一点,我必须首先检查原始传入URL,如果它已经包含account,则不要重定向,否则它是一个无限循环。这似乎太奇怪和不必要了。

使account始终作为URL的一部分出现的正确方法是什么?

我的理解是MVC框架会尝试使用参数设置在路由中,只有在没有找到的情况下,它才会追加

你的理解不正确。ASP。. NET MVC不附加任何东西。它是客户端浏览器发送HTML规范中定义的表单提交:

FORM元素的method属性指定所使用的HTTP方法将表单发送给处理代理。这个属性可以取两个价值观:

  • get:使用HTTP"get"方法,表单数据集被附加到action属性指定的URI(带有问号("?"))作为分隔符),这个新的URI被发送到处理代理。
  • post:使用HTTP"post"方法,表单数据集包含在表单主体中,并发送给处理代理。

ASP。NET MVC路由用于解析传入的客户端HTTP请求,并将其重新分配给相应的控制器操作。它们也被HTML助手(如Html.ActionLinkHtml.BeginForm)用来生成正确的路由。只是对于您需要提交用户输入值作为url路径(而不是查询字符串)的一部分的特定场景,HTML规范没有提供任何东西。

所以,如果你想对抗HTML规范,你将不得不使用其他工具:javascript。你可以使用GET方法,订阅表单的提交处理程序并在其中操作url后面附加的值是?满足您的要求。

不要认为这是ASP。NET MVC和路由之类的。把它想象成一个简单的HTML页面(这当然是浏览器看到的),并开始从这方面解决问题。如何在一个简单的HTML页面中实现这一点呢?

相关内容

最新更新