如何隐藏URL的参数

时间:2014-05-07 09:17:02

标签: c# asp.net-mvc-4

我当前的网址为/Product/Create?date=5/7/2014%2012:00:00%20AM

其实我想要这样:/ Product / Create

我的示例代码是:

public class ProductController : Controller
{
    public ActionResult Create(DateTime date)
    {
        ViewBag.Date = date;
        return View();
    }
}

任何人都可以帮助我?

4 个答案:

答案 0 :(得分:2)

您可以使用HttpPost强制执行此操作:

public class ProductController : Controller
{
    [HttpPost]
    public ActionResult Create(DateTime date)
    {
        ViewBag.Date = date;
        return View();
    }
}

在致电行动时,您需要通过表格提交。如果您向我们展示您如何称呼它的代码,我们可以帮助您...

HttpPost attribut将强制您使用" post" - 如果你还想要"其他选项"你可以放弃这个属性,只需使用" post"为你理想的情况。

更新:
您需要调用以下操作:

@using(Html.BeginForm("Create", "Product", FormMethod.Post))
{
    @Html.Hidden("date", DateTime.Now.ToString())
    <input type="submit" value="create">
}

到目前的代码<a href="/Product/Create?date=@DateTime.Now.Date">
这会创建一个GET请求,即使您希望这样做,也应该执行以下操作:

@Html.ActionLink("Create", "Product", new { date = DateTime.Now.ToString() })

这将在帐户中采用正确的路由并创建有效的链接。

使用例如JQuery如果启用了JS,您可以执行以下操作:

@using(Html.BeginForm("Create", "Product", FormMethod.Post, new { id = "myForm" }))
{
    @Html.Hidden("date", DateTime.Now.ToString())
    <input id="myFormSubmit" type="submit" value="create">
    <a id="myFormLink" href="#" style="display: none;" onclick="$('#myForm').submit(); return false;">create</a>
}
<script type="text/javascript">
    $(document).ready(function () {
        $('#myFormLink').show();
        $('#myFormSubmit').hide();
    });
<script>

答案 1 :(得分:2)

假设这实际上是对需要Date参数的视图的GET请求(无论出于何种原因)我说你最好的选择是将信息作为请求中的自定义标头传递< / p>

GET /Products/Create HTTP/1.1
X-YourApp-Date: 2014-07-05T12:00:00

您的行为将如下所示

public ActionResult Create() <-- no parameters
{
    ViewBag.Date = DateTime.ParseExact(Request.Headers["X-YourApp-Date"], 
        "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
    return View();
}

一些附注

  • 通常最好使用UTC作为日期,而不是本地(但实际上取决于具体情况)
  • 如果日期很重要或者与安全性有关,那么您应该加密它。
  • 如果您将字符串作为字符串传递使用一致格式并坚持使用,那么在服务器端解析时会更容易(参见示例)

答案 2 :(得分:1)

此外,控制器更改仅处理POST请求

...
[HttpPost]
public ActionResult Create(DateTime date)
...

您还必须将标记中调用操作的代码从链接更改为

@using(Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { style = "display:inline" })) {
    @Html.Hidden("date", DateTime.Now.ToString())
    <a href="#" onclick="this.parentNode.submit(); return false">Whatever</a>
}

答案 3 :(得分:1)

在JS中:

window.history.pushState("", "", "/Product/Create");