我在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
,这也不是我想要的,这违背了我的理解。我的理解是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
始终显示为网址的一部分的正确方法是什么?
答案 0 :(得分:1)
我的理解是MVC框架会尝试使用 在路径中设置的参数,只有在未找到的情况下才会追加 他们之后?
您的理解不正确。 ASP.NET MVC不附加任何内容。它是客户端浏览器发送HTML specification:
中定义的表单提交FORM元素的method属性指定使用的HTTP方法 将表单发送给处理代理。此属性可能需要两个 值:
- get:使用HTTP“get”方法,表单数据集将附加到action属性指定的URI(带有问号(“?”)) 作为分隔符)并将此新URI发送给处理代理。
- post:使用HTTP“post”方法,表单数据集包含在表单正文中并发送给处理代理。
ASP.NET MVC路由用于解析传入的客户端HTTP请求并将其重新分发到相应的控制器操作。 HTML助手(例如Html.ActionLink
或Html.BeginForm
)也使用它们来生成正确的路由。对于您需要提交用户输入的值作为url路径(不是查询字符串)的一部分的特定情况,HTML规范无法为您提供。
因此,如果您想要与HTML规范作斗争,则必须使用其他工具:javascript。所以你可以使用GET方法并订阅表单的提交处理程序,并在其内部操纵url,以便在?之后附加的值。满足您的要求。
不要将其视为ASP.NET MVC和路由和东西。可以把它想象成一个简单的HTML页面(当然是浏览器看到的)并开始从这一方面解决问题。你会在一个简单的HTML页面中实现这个目标吗?