首页 > 解决方案 > .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 }
    );
}

标签: c#.netasp.net-mvc

解决方案


问题是我的按钮,尽管不是“提交”或“输入”类型,但正在诱导页面的表单提交。将按钮移到表单外更正了该行为。

根据此页面,如何防止按钮提交表单 <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>

推荐阅读