代码之家  ›  专栏  ›  技术社区  ›  MedicineMan

当我使用窗体调用控制器上的方法时,我希望页面刷新,并且URL显示传递的变量ASP MVC

  •  2
  • MedicineMan  · 技术社区  · 14 年前

    使用ASP MVC,我已经为localhost/dinner/100设置了一个网页,显示id=100的晚餐详细信息。

    在页面上,有一个下拉列表显示“晚餐1”、“晚餐2”等。用户应从表单中选择感兴趣的晚餐(晚餐2,ID=102),然后按“提交”。页面应该刷新并显示url:localhost/dinner/102,并显示dinner 2的详细信息。

    我的代码正在工作,除了URL。在此期间,我的URL显示localhost/dinner/100,尽管它正确地显示了dinner 2(id=102)的详细信息。

    我的控制器方法非常简单:

        public ActionResult Index(string id)
        {
            int Id = 0;
            if (!IsValidFacilityId(id) || !int.TryParse(id, out Id))
            {
                return Redirect("/");
            }
    
            return View(CreateViewModel(Id));
        }
    

    你能帮我弄明白怎么把这些都做好吗?

    P.S.I确实为该方法创建了一个自定义路由:

    routes.MapRoute(
                "DinnerDefault",                         // Route name
                "Dinner/{id}",                           // URL with parameters
                new { controller = "Dinner", action = "Index", id = "" }  // Parameter defaults
            );
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Ivan Butsyrin    14 年前

    如果您使用的是ASP.NET MVC HTMLHelper BegInform()方法,请记住,通过dadefault,它将使用post方法。

    我认为最简单的方法是通过重定向到操作结果来实现这一点。

    观点:

    <body>
        <% Html.BeginForm("Select", "Home"); %>
                <select id="dinners" name="dinners">
                    <option value="100">dinner 1</option>
                    <option value="101">dinner 2</option>
                    <option value="102">dinner 3</option>
                </select>
                <button type="submit"></button>
        <% Html.EndForm(); %>
    </body>
    

    控制器:

        public ActionResult Index(string id)
        {
            int Id = 0;
            if (!IsValidFacilityId(id) || !int.TryParse(id, out Id))
            {
            return Redirect("/");
            }
    
            return View(CreateViewModel(Id));
    
        }
    
        public ActionResult Select(string dinners)
        {
            return RedirectToAction("Index", "Home", new {id = dinners});
        }
    
        2
  •  0
  •   Richard Garside    14 年前

    表单中的输入字段只能更改URL的querystring部分,并且仅当使用“get”作为方法时才可以更改。

    晚餐ID可能正作为“post”值传递。这将隐藏在页面的HTTP头中,但会覆盖可见URL中的值。

    您可以在html.begininform中更改表单发布到的URL,但不能根据表单输入动态更改,除非您使用javascript更改表单的操作。

    更简单的做法可能是从控制器返回RedirectToAction结果:

    return RedirectToAction("Index", new { id = 102 ]);
    

    但你需要确保你只在邮寄申请时才这么做。