.net MVC4表单提交生成?代替/在url中 - 错误的路由?

时间:2014-02-08 17:40:31

标签: asp.net-mvc forms asp.net-mvc-4

我是asp.net mvc4的新手,现在尝试一些练习。在对路由进行一些研究后,我仍然遇到在表单提交后传递参数的问题。

我的表单如下:

@using (Html.BeginForm("Index", "Resplaner", FormMethod.Get, new { name = "navigation", id = "navigation" }))
{
    <select name="id" size="15" id="nav_menu">
        @foreach (var categorie in Model.Categories)
        {
            <optgroup label="@categorie.Name">
                @foreach (var ressource in Model.Ressources)
                {
                    if (@categorie.Id == ressource.Type)
                    {
                        <option value="@ressource.Id">@ressource.Name</option>
                    }
                }
            </optgroup>
        }
    </select>
}

由以下java脚本提交:

$('#nav_menu').on('click', function (event) {
            if ($(event.target).is("option")) {
                var form = $(event.target).parents('form');
                form.submit();
            }
        });

我的实际路线配置如下:

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Resplaner",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Resplaner", action = "Index", id = UrlParameter.Optional }
            );

所以我的问题是,我在表单提交后生成的url看起来像这样

http://localhost:62456/Resplaner?id=6

但我想要的网址看起来应该是这样的

http://localhost:62456/Resplaner/Index/6

如果我手动输入第二个网址到我的浏览器,会显示正确的结果...这就是为什么我猜我提交表单的方式有问题。或者我的路线还在弄乱。

我已经在mvc4中做了一些关于表单的示例教程,但是它们总是用在像我这样的不同情况下。所以我会很乐意伸出援助之手。

我感谢每一个帮助:)

问候Kurn

2 个答案:

答案 0 :(得分:0)

这是我的解决方案 -

让你的html像这样 -

@using (Html.BeginForm("Index", "Resplaner", new { name = "rami", id = "1" }, FormMethod.Get))
{
    // ....
}

然后有这样的路线 -

routes.MapRoute(
        name: "MyRoute",
        url: "{controller}/{action}/{name}/{id}",
        defaults: new { controller = "Resplaner", action = "Index" }
    );

然后你的jquery点击表单提交,你的URL将是 -

enter image description here

网址将是 - http://localhost:5738/Resplaner/Index/rami/1?

注意:如果您不想在结尾处使用该问号,请进行POST而不是GET。

另一种解决方案是使用隐藏字段 -

@using (Html.BeginForm("Index", "Resplaner", FormMethod.Get))
{
    @Html.Hidden("id", "1");
    @Html.Hidden("name", "rami");
    <input type="submit" value="click"/>
}

但是这种方法再次给你 - http://localhost:5738/Resplaner/Index?id=1&name=rami

另一个备选方案是使用所需的URL创建@Html.ActionLink()并使其在jquery中单击。

答案 1 :(得分:0)

好的,以另一种方式修复它。

为了解决我的实际问题,我刚在我的控制器中添加了一个新动作,它接收带有问号的表单参数,然后只需重定向到所需的URL。

[HttpGet]
public ActionResult IndexMap(String id = "1")
{
    return RedirectToAction("Index", "Resplaner", new { id = id });
}

由于第二次服务器调用,这可能不是最好的方法。但对于我的项目,我没有看到任何性能问题,因为它只会在内联网中使用。

http://localhost:62456/Resplaner/IndexMap?id=2会重定向到http://localhost:62456/Resplaner/Index/2

我要感谢所有试图帮助我的人。你给了我一些很棒的建议和想法。