【问题标题】:ASP.NET MVC Redirect to same page after submit button is clicked单击提交按钮后,ASP.NET MVC 重定向到同一页面
【发布时间】:2016-08-17 23:25:53
【问题描述】:

我和一些朋友已经开始了一个团队项目,但我们被困在了这一点上。我们制作了网站的功能,可以在每个帖子下添加 cmets。问题是单击提交时,它会添加评论但不会刷新页面,这会导致一些问题。作者保持“匿名”,点击刷新按钮时会显示警报:

您要查找的页面使用了您输入的信息。返回该页面可能会导致您重复执行的任何操作。你想继续吗?

但是,如果我们再次输入 URL 并单击 ENTER,一切都很好:作者出现了,而评论只出现了一次。所以我们唯一的解决方案是重定向到同一页面。这是表格:

<div style="text-align: left">
  <div><i>Leave your comment</i>
  </div>
  <form method="post">
    <fieldset>
      <p>
        <textarea rows="10" class="form-control" type="text" id="1" name="commentText" style="height: 100px"></textarea>
      </p>

      <p>
        <input type="submit" name="buttonSubmit" onclick="redirect" value="Add comment" class="btn btn-default" style="" />
      </p>
    </fieldset>
  </form>
</div>

这是 cmets 在页面上的打印方式:

 <h3>Comments</h3> 
<br>
<div>
  @foreach (var comment in ViewBag.Comments) {
  <section class="row">
    <article class="post col-md-12">
      <div class="about">
        Posted on <i>@comment.Date</i>
        @if (comment.AuthorId != null) { @: by <i>@comment.Author.FullName</i>
        }else { @: by <i>anonymous</i>
        }
      </div>
      <div class="body">@comment.Text</div>
    </article>
  </section>
  }
</div>

提前致谢!

【问题讨论】:

  • 嗯,到服务器的数据是通过控制器发送的,我们在应用程序的任何地方都使用这种类型的发送。我无法完全理解您答案的第二部分。如何做到这一点。
  • 没关系。您可以添加 Ajax 功能并仍然使用“常规”控制器。如果你愿意,你也可以走ApiController 路线。如何做到这一点可能会由教程更好地回答。一个非常简单的启动器是this。您可以进行更深入的搜索; web api 路由也是如此。

标签: html asp.net database redirect form-submit


【解决方案1】:

使用@Ajax.BeginForm() 助手。

AjaxOptions() 中,您需要将 Httpmethod 设置为“Post”、InsertionMode.InsertBefore(或 After,具体取决于您想要新 cmets 的位置)和 UpdateTargetId =“your-comment-div”。

您需要包含 jquery.unobtrusive-ajax.js 以便 Ajax 帮助程序正常工作。您可以使用 nuget 包管理器将其拉入。请务必将其添加到您的 jquery 包中。

然后,您需要在控制器中创建发布操作以接受评论参数并返回部分视图。

这样做会使 Ajax 仅限于剃刀助手和控制器方法。

查看:

    @using (Ajax.BeginForm("AjaxAddComment",
                           "MyController", 
                           /* route params */, 
                           new AjaxOptions()
                           {
                               InsertionMode = InsertionMode.InsertBefore,
                               UpdateTargetId = "commentsDiv",
                               HttpMethod = "Post"
                           }, htmlAttributes: new { /* ... */ }))
    {
        <div class="form-horizontal">
            @* comment form... *@
        </div>
    }

   ...

    <div id="commentsDiv">
        <div class="comment">...</div>
        <div class="comment">...</div>
    </div>

控制器:

[HttpPost]
//[ValidateAntiForgeryToken]
public async Task<PartialView> AjaxAddComment(string comment, /*...other params*/)
{
    var newComment = ... // comment viewModel
    // add comment to db
    await db.SaveChangesAsync();

    return PartialView("_CommentPartial", newComment);       
}

_CommentPartial:

<div class="comment">
    ...
</div>

【讨论】:

  • 有没有办法使用javascript或c#方法并在按钮提交上添加onclick事件?我进行了一项研究,但没有一个选项对我们有用。也许我们做错了什么。
  • 如果需要,您可以使用带有 Ajax 调用的 JavaScript onclick 事件。这取决于你的喜好。我只是认为 Ajax html 助手在这个简单的案例中读起来更好。
  • Sooo 尝试在按钮上使用“formaction”事件。它重定向但没有帮助。我的意思是在重新加载页面之前,作者仍然保持“匿名”状态。也许我们会尝试上面的一些解决方案。我们仍然是初学者,对我们来说似乎有点困难,但没有其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多