在MVC3中,如何创建像mydomain.com/chigago这样的路由并从GET表单中获取该路由?

时间:2012-11-05 14:32:37

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我有一个在地图上显示位置的应用程序。我已创建了一条路线,以便我可以拥有不错的黑客网址,例如http://www.mydomain.com/paris。只需输入URL就行了,但我在主页上有一个发送GET请求的搜索表单。提交表单后,位置栏中显示的URL的格式为http://www.mydomain.com/Dashboard?location=paris。通常这不会太重要,因为它正在执行正确的操作,但我有一个运行show的backbone.js应用程序,它特别关注URL结构。

如果没有javascript或重定向,可能无法做到我需要的东西,因为填写表格ACTION属性时位置是未知的 - 但任何人都可以确认吗?

这是我的路线。

public static void RegisterRoutes( RouteCollection routes )
{
    routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
    routes.MapRoute(
        String.Empty,
        "{location}",
        new { 
            controller = "Dashboard",
            action = "Index",
            id = ""
        }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional
        } // Parameter defaults
    );

}

这是控制器。

public class DashboardController : Controller
{
    [HttpGet]
    public ViewResult Index(string location)
    {
        return View(new AccItemSearch { Location = location });
    }
}

这是表格。

        @using (Html.BeginForm("Index", "Dashboard", FormMethod.Get)) {
                <h2>Where are you going?</h2>
                <input type="text" placeholder="Area, town or postcode" id="location" name="location"/>
                <button>Search!</button>
            </div>
        }

澄清:我想要帮助的问题是如何让用户提交表单然后降落到网址为http://www.mydomain.com/searchterm的网页上,从而匹配路线,而不是在包含网址http://www.mydomain.com/Dashboard

的网页上

2 个答案:

答案 0 :(得分:0)

该表单应该是POST以提交表单数据。

搜索应该是提交按钮

 <input type="submit" name="Search" value="Search" />

否则它看起来不错,除非你有一个冲突的路线。孤立地测试你的路线,看起来很好。只是该位置没有被发送。

答案 1 :(得分:0)

在HTML生成(即服务器端)期间,您将无法更改表单的action属性,因为您根本不知道它应该指向什么。因此,如果您需要URL最终成为确切的搜索词,最简单的选择可能是在提交表单之前使用JavaScript将action属性更改为它,并且有一个控制器可以捕获遵循www的所有URL .domain.com / searchterm模式。

您无法真正重定向到特定操作,因为这会成为返回到浏览器的网址,我怀疑您希望每个搜索字词都有一个操作。

<强> HTML:

<form method="post" id="myform">
    <input type="text" id="searchterm" />
    <input type="submit" value="Search" />
</form>

<强> jQuery的:

$(function () {
    $("#myform").submit(function () {
        var searchVal = $("#searchterm").val();
        $(this).attr("action", searchVal);
    });
});

<强>路线:

routes.MapRoute(
    "",
    "{searchterm}",
    new { controller = "Home", action = "Search" }
);

请注意,必须先将放在默认路由之前。

<强>动作:

public ActionResult Search(string searchterm)
{
    //do stuff
}

现在,如果访问者输入“阿拉斯加”一词并提交搜索表单,他们最终将访问domain.com/Alaska。