c# - .Net Framework C# MVC 自发重定向到来自错误控制器的视图
问题描述
我有一个非常基本的小项目,VS 2013,安装了 System.Web.Mvc (5.2.7) 的 .Net Framework 4.5。
没有特殊的路由或身份验证;只有 3 个控制器从 EF 上下文中搭建。其中一个控制器称为 DataRoutesController,另一个是 DataRouteViewFieldsController。DataRouteViewFields 是 DataRoute 的子项(外键)。在 DataRoute 的 Edit 页面上,我有一个表格,其中列出了相关的 ViewFields,每一行都有自己的编辑和删除按钮。
<button class="btn btn-sm btn-primary"
onclick="location.href='@Url.Action("Edit", "DataRouteViewFields", new { id = item.RouteId, name = item.Name })'"
title="Edit">
<span class="glyphicon glyphicon-pencil"/>
</button>
当我单击按钮时,它会调用正确的控制器并继续执行 return 语句。
public ActionResult Edit(int? id, string name)
{
DataRouteViewField dataRouteViewField = db.DataRouteViewFields.Find(id, name);
return View(dataRouteViewField);
}
但是,由于某种原因,我无法理解我调用 DataRouteController Index() 路由并返回错误的页面。
public ActionResult Index()
{
var dataRoutes = db.DataRoutes.Include(d => d.Connection);
return View(dataRoutes.ToList());
}
当我不使用按钮时,不会观察到这种行为。如果我键入 URL 以手动编辑 ViewField,它会按预期工作。
当我在从 DataRouteViewFieldController.Edit(...) 返回后逐步执行代码 (F11) 时,它会继续执行 _ViewStart,然后继续执行 DataRouteViewFieldController 的 Edit.cshtml,就像它应该的那样。当它完成 Edit.cshtml 时,它会呈现错误的页面。出于故障排除目的,Edit.cshtml 页面大部分为空白:
@model ctNetData.DataRouteViewField
@{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit</h2>
如果我在 DataRoutesController.Index() 中添加一个中断,那么该过程开始在 DataRouteViewFieldsController.Edit(...) 和 DataRoutesController.Index() 中的代码行之间来回翻转,就像它同时处理两个线程一样.
有人知道这里发生了什么吗?
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
解决方案
问题是我的按钮,尽管不是“提交”或“输入”类型,但正在诱导页面的表单提交。将按钮移到表单外更正了该行为。
根据此页面,如何防止按钮提交表单 <Button/>
的默认类型为“提交”。所以有两种治疗方法。将外键表移到表单外,或将按钮的类型指定为按钮。
@using (Html.BeginForm())
{
//Button submits form, has behavior described above
<button class="btn btn-xs btn-primary" onclick="location.href='@Url.Action("Edit", "DataRouteViewFields", new { id = item.RouteId, name = item.Name })'" title="Edit">
<span class="glyphicon glyphicon-pencil" />
</button>
//Button below works as expected
<button type="button" class="btn btn-xs btn-primary" onclick="location.href='@Url.Action("Edit", "DataRouteViewFields", new { id = item.RouteId, name = item.Name })'" title="Edit">
<span class="glyphicon glyphicon-pencil" />
</button>
}
//Button works as expected
<button class="btn btn-xs btn-primary" onclick="location.href='@Url.Action("Edit", "DataRouteViewFields", new { id = item.RouteId, name = item.Name })'" title="Edit">
<span class="glyphicon glyphicon-pencil" />
</button>
推荐阅读
- excel - 从 Outlook 中的电子邮件下载文件
- php - 单击提交时消息字段变为空
- visual-studio-code - 了解 VSCode 键绑定:
对比 - css - CSS - 丢失的网格删除丢失的列,媒体查询
- java - 从另一个类调用方法时出现 NullPointerException
- c# - 更新面板代码后,某些计算值无法设置到文本框中。
- c++ - 当钩子启动一个新线程时取消钩子进程
- scala - .sc 和 .scala 文件有什么区别?
- d3.js - 使用reduce回调方法减少组的复合图表中的dc折线图
- java - 从测试类 null 自动装配的 SpringBoot 组件