MVC Razor - 带锚定动作的BeginForm

时间:2017-09-29 14:34:58

标签: html asp.net-mvc razor encoding anchor

我有一个靠近页面底部的联系表单,需要滚动才能访问;提交表单时,页面会重新加载,我需要页面转到联系表单的锚点。当我改变BeginForm的动作时,'#'在锚内被编码为'%23' - 我该如何阻止这种形式发生?

我需要它在不使用任何JavaScript的情况下运行。

@{
    using (Html.BeginForm(null, null, new { ReturnURL = "#contact" }, FormMethod.Post, new { novalidate = "novalidate" }))
    {
        //Fields...

        <button type="submit">Submit</button>
    }
}

上面的代码将返回以下HTML,并且不会转到锚点:

<form action="/en/Home/Contact?ReturnURL=%23contact" method="post" novalidate="novalidate"> 

虽然以下HTML会(但我不知道如何使用Razor生成它):

<form action="/en/Home/Contact?ReturnURL=#contact" method="post" novalidate="novalidate"> 

我也尝试了以下内容,但是&#39;#&#39;始终编​​码:

using (Html.BeginForm(null, null, new { ReturnURL = HttpUtility.HtmlDecode("#contact") }, FormMethod.Post, new { novalidate = "novalidate" }))

using (Html.BeginForm(null, null, new { ReturnURL = HttpUtility.UrlDecode("#contact") }, FormMethod.Post, new { novalidate = "novalidate" }))

using (Html.BeginForm(new { action = Url.Action("Index", "Home") + Html.Raw("Contact/#contact") }))

1 个答案:

答案 0 :(得分:0)

似乎使用了关键字&#39; action&#39;覆盖表单的操作 - 以下代码是一个解决方案:

using (Html.BeginForm(null, null, FormMethod.Post, new { action = "#contact" }))

提交后,用户将被发送到site.com/#contact

对于表格不在索引/主页/首页上的网站,我使用以下内容构建路线:

using (Html.BeginForm(null, null, FormMethod.Post, 
  new { action = string.Format("{0}/{1}#contact", 
        ViewContext.RouteData.Values["controller"], 
        ViewContext.RouteData.Values["action"])
  }))