ASP.NET MVC:视图按钮传值及避免刷新重复执行随机逻辑
解决ASP.NET MVC刷新页面重复执行随机化的问题
你的问题出在使用GET请求触发随机化操作,导致浏览器地址栏停留在randButton的URL上,刷新时会重复执行该方法。要实现「仅点击按钮时随机化,页面刷新不执行」,需要改用POST请求+重定向(PRG模式:Post/Redirect/Get),具体步骤如下:
1. 修改前端按钮为POST请求
把原来的<a>标签改成表单提交的按钮,这样点击时发送POST请求,而非GET:
<!-- 用表单包裹按钮,最简单的实现方式 --> <form asp-action="randButton" asp-controller="Home" method="post"> <button type="submit" class="btn btn-primary">Randomize</button> </form>
如果想保留<a>标签的样式,可以隐藏表单,用JS触发提交:
<a href="#" class="btn btn-primary" onclick="document.getElementById('randForm').submit(); return false;">Randomize</a> <form id="randForm" asp-action="randButton" asp-controller="Home" method="post" style="display: none;"></form>
2. 修改控制器方法,添加POST特性并重定向
给randButton方法加上[HttpPost]特性,确保只有POST请求能触发;执行完随机化后,重定向到Index页面,而不是直接返回Index视图:
[HttpPost] public IActionResult randButton() { resetSelections(); setSelections(); FetchData(); // 方式1:用TempData传递数据给Index(需确保数据可序列化) TempData["Restaurants"] = restaurants; return RedirectToAction("Index"); // 方式2:如果setSelections是把选中状态存在Session/缓存中,可直接重定向,Index会自动读取状态 // return RedirectToAction("Index"); }
同时调整Index方法,优先读取TempData中的数据(如果用方式1):
public IActionResult Index() { var restaurants = TempData["Restaurants"] as List<你的实体类>; if (restaurants == null) { if (checkDate()) { setSelections(); } FetchData(); restaurants = this.restaurants; } return View(restaurants); }
原理说明
- 改用POST请求:避免GET请求的URL被浏览器记录,刷新时重复执行操作;
- 重定向到Index:执行完POST操作后,浏览器地址栏会更新为Index的URL,此时刷新只会触发Index的GET请求,不会再执行随机化逻辑。
内容的提问来源于stack exchange,提问作者Troy Mulkey
相关产品推荐
相关产品推荐

