MVC路由URL不包含参数

时间:2015-06-07 13:26:56

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

我试图绕过.NET MVC5路由。

我有一张表格:

@using (Html.BeginForm("ProductsCheaperThan", "Home", FormMethod.Post))
{
    <input type="text" name="comparisonPrice" />
    <button type="submit">Search!</button>
}

我有一个控制器Home和一个带有参数ProductsCheaperThan的行动comparisonPrice

public ActionResult ProductsCheaperThan(decimal comparisonPrice)
{
    ViewBag.FilterPrice = comparisonPrice;
    var resultSet = new ProductService().GetProductsCheaperThan(comparisonPrice);
    return View(resultSet);
}

这会在输入中发布值(假设我发布的值为20)回到我的操作,并正确地将我发送到~/Home/ProductsCheaperThan。问题是,我希望被路由到~/Home/ProductsCheaperThan/20

我希望这样做,以便在有人为该页面添加书签时,他们在重新访问该页面时不会收到错误。

我想添加类似的东西:

routes.MapRoute(
    name: "ProductsCheaperThan",
    url: "Home/ProductsCheaperThan/{comparisonPrice}",
    defaults: new { controller = "Home", action = "ProductsCheaperThan", comparisonPrice = 20 }
);

可能有用,我有一个解决我的问题的方法,它将表单更改为GET

@using (Html.BeginForm("ProductsCheaperThan", "Home", FormMethod.Get))

并生成一个~/Home/ProductsCheaperThan?comparisonPrice=20的网址,但会使用查询字符串,而不是我的目标。

有人可以帮我弄清楚我的网址吗?

3 个答案:

答案 0 :(得分:1)

您应该为您的操作添加[HttpPost] public ActionResult ProductsCheaperThan(decimal comparisonPrice) { ViewBag.FilterPrice = comparisonPrice; var resultSet = new ProductService().GetProductsCheaperThan(comparisonPrice); return View(resultSet); } 属性

typedef void    (*initMyfuncs_t)(Init_t*, CallBacks_t *,result_t*);
extern initMyfuncs_t _initMyfuncs;

答案 1 :(得分:1)

一种选择是使用JQuery -

<div>
    <input type="text" name="comparisonPrice" id="comparisonPrice" />
    <button type="button" id="Search">Search!</button>
</div>

@section scripts{
    <script>
        $(function () {
            $("#Search").click(function () {
                window.location = "@Url.Action("PriceToCompare", "Home")" + "/" + $("#comparisonPrice").val();
            });
        });
    </script>
}

以上脚本将导致 - http://localhost:1655/PriceToCompare/Home/123

答案 2 :(得分:0)

我认为您可以使用重载来指定路线值:

@using (Html.BeginForm("Login", "Account", new { comparisonPrice= "20" })) { ... }