Asp.net mvc .net MVC4表单提交是否生成?而不是url中的/--路由错误?

Asp.net mvc .net MVC4表单提交是否生成?而不是url中的/--路由错误?,asp.net-mvc,forms,asp.net-mvc-4,Asp.net Mvc,Forms,Asp.net Mvc 4,我对asp.NETMVC4有点陌生,现在试着进行一些练习。在对路由进行了一些研究之后,我仍然遇到了一个在表单提交后传递参数的问题 我的表单如下所示: @using (Html.BeginForm("Index", "Resplaner", FormMethod.Get, new { name = "navigation", id = "navigation" })) { <select name="id" size="15" id="nav_menu"> @f

我对asp.NETMVC4有点陌生,现在试着进行一些练习。在对路由进行了一些研究之后,我仍然遇到了一个在表单提交后传递参数的问题

我的表单如下所示:

@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>
}
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 }
            );
我的实际路线配置如下:

@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>
}
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

但是我想要的url应该是这样的

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

如果我在浏览器中手动键入第二个url,则会显示正确的结果。。。这就是为什么我想我提交表格的方式有问题。或者我的路线还是一团糟

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

我感谢你的帮助:)


问候Kurn

我的解决方案来了-

让你的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将是-

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

注意:如果你不想在结尾处打问号,那么就发表一篇文章,而不是获取

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

@using (Html.BeginForm("Index", "Resplaner", FormMethod.Get))
{
    @Html.Hidden("id", "1");
    @Html.Hidden("name", "rami");
    <input type="submit" value="click"/>
}
@使用(Html.BeginForm(“Index”,“Resplaner”,FormMethod.Get))
{
@Html.Hidden(“id”,“1”);
@Html.Hidden(“name”、“rami”);
}
但同样,这种方法将为您提供-
http://localhost:5738/Resplaner/Index?id=1&name=rami


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

确定以另一种方式修复它

为了解决我的实际问题,我只是在我的控制器中添加了一个新操作,它接收带有问号的表单参数,并简单地重定向到所需的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


我要感谢每一个试图帮助我的人。你给了我一些很好的建议和想法

不要为动作和控制器值设置
null
,而是将它们放入
Html.BeginForm()
语句中。如果您是对的,请修复它。但我的问题仍然是一样的:)我的第二点意见是你们的两条路线完全相同。默认设置不会导致路由引擎选择其中一个。删除第二条路由并告诉我结果。我认为默认路由调用HomeController,第二条调用ResplanerController。但是我删除了第二条路线,所有的东西仍然正确导航。但是url还是写错了吗?而不是/:sw如果您只是使用(Html.BeginForm())来使用
,会发生什么情况{
而不是重载呼叫方?谢谢你的详细回答。我尝试了你的第一个解决方案。这里的问题是,id是固定的。这个解决方案的结果对我来说是这样的
http://localhost:62456/Resplaner/Index/1?id=11
。我今天没有时间做更多的测试。您最后的解决方案似乎是最好的我。我会继续使用actionlink,并抛弃关于表单的想法。@KURN,你有合适的路线吗,如图所示是我吗?是的,我实现了你所有的代码1:1来测试它。奇怪的是html源代码被改成了这个
。但即使actionlink方式似乎也是最简单的一种好吧,我尝试了你的第一个解决方案再次使用post方法进行编辑。表单的导航现在起作用了。但是url仍然没有改变:S无论我导航哪个项目,url总是
http://localhost:62456/Resplaner/Index/1
。html表单代码看起来像这样的
对我来说是不正确的,因为/1应该是动态的。我真的以为了解mvc asp.net中的整个路由系统…但似乎不是:)@KURN,这是因为我已将其硬编码为
id=“1”
。您必须通过JS或ViewBag等使其动态化。