【问题标题】:Controller not routing to correct view控制器没有路由到正确的视图
【发布时间】:2014-04-07 18:58:38
【问题描述】:

在我们的 ASP MVC 3 Intranet 站点上,我们有两个用于创建新代理的选项。基本方法是简单地通过标准的、开箱即用的Create 控制器。这里没有什么太花哨的。

第二种是克隆一个已经存在的代理。从控制器的索引中,用户可以选择一个“克隆”链接,该链接会将它们发送到名为CloneAgent 的不同方法(我们这样做是为了保持逻辑分离并且代码更清晰/更易于维护)。

两种方法都返回相同的Create 视图。在标准的Create 方法中,return 语句只是一个简单的

return View(modelObj)

CloneAgent 方法中,return 语句并不复杂

return View("Create", modelObj)

当我在本地运行该站点时,AgentClone 工作正常,但是浏览器中的 URL 是这样的

http://localhost:2574/AgentTransmission/CloneAgent/0?agentId=%20%2011317710

当我在服务器上运行时,我得到了相同的 URL,但是我得到了我们的自定义错误消息之一,而不是页面加载。

有人可以为AgentClone 方法提供正确的return 语句吗?

更新:

忘了提 - 将AgentClone 方法的return 语句放在try 语句中。当我将代码放在服务器上时(在本地运行仍然可以正常运行),我没有看到错误消息,所以我不确定在哪里查找错误。

代理克隆

    //GET
    public ActionResult CloneAgent(int id, int agentId = 0)
    {
        //Tax ID info
        ViewBag.FullSSN = Security.IsFullSsn(User);

        AgentTransmission clone;
        try
        {
            if (id == 0)
            {
                MonetToDssClient client = new MonetToDssClient();

                CloneMessage msg = client.CloneRequest("1234678");

                //TODO: make sure we are cloning appropriate fields
                clone = AgentTransmission.MapObject(msg.AgentInformation);

                EventLog.WriteEntry("Monet", "Clone complete", EventLogEntryType.Information);
            }
            else
            {
                //TODO: make sure this method still applicable to add all agents
                clone = Clone(db.AgentTransmission.Find(id));
            }

            clone.FormattedReferenceNumber = ReferenceConversion.UnobAndFormat(clone.ReferenceNumber, "S");
            clone.ReferenceNumber = ReferenceConversion.ObfuscateReference(clone.ReferenceNumber);

            DisplayPrep();
            clone.SetDropDowns();

            EventLog.WriteEntry("Monet", "Heading back to Create", EventLogEntryType.Information);

            return View("Create", clone);
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("Monet", ex.Message, EventLogEntryType.Warning);
            string s = ex.Message;
            throw;
        }

    }

MapObject模型对象方法

    //Use AutoMapper plugin to convert from MonetToDss namespace
    public static AgentTransmission MapObject(AgentClone source)
    {
        AgentTransmission destination = new AgentTransmission();

        //Create mapp between namespace models
        Mapper.CreateMap<AgentClone, AgentTransmission>();

        //Map AgentClone to AgentTransmission
        destination = Mapper.Map<AgentClone, AgentTransmission>(source);

        return destination;
    }

查看(仅标题)

@model Monet.Models.AgentTransmission

@{
    ViewBag.Title = "Create new Agent";
}

第二次编辑

这是引发异常的堆栈跟踪。

System.InvalidOperationException

System.InvalidOperationException: The view '~/Views/AgentTransmission/Create' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/AgentTransmission/Create
   at System.Web.Mvc.ViewResult.FindView(ControllerContext context)
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass27.<>c__DisplayClass2c.<BeginInvokeAction>b__22()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass27.<BeginInvokeAction>b__24(IAsyncResult asyncResult)
thrown in AgentTransmission/CloneAgent

任何建议都将不胜感激,因为如下图所示,文件路径 Views/AgentTransmission/Create 存在(堆栈跟踪的底部显示此错误是在 AgentTransmission 控制器中引发的

【问题讨论】:

  • 添加一个带有一些日志记录的异常过滤器并找出错误是什么。
  • modelObj 中是否存在“AgentId”?是不是modelObj模型绑定不好的情况?
  • @asawyer - 抱歉忘记在帖子中提及这一点。我将return 语句包装在try 块中,没有看到抛出异常。我认为它正在寻找我们没有的AgentClone 视图。
  • @Rikon - 是的,两个 modelObj 上都存在“AgentId”。它们都是同一类型。
  • 这不是我的建议,尝试添加异常过滤器并在那里记录错误。

标签: c# .net asp.net-mvc-3 iis asp.net-mvc-routing


【解决方案1】:

这似乎从一开始就写得不好。您已在 ActionResult 上方评论说这显然是一个获取,但您正在返回“创建”视图。

无论是哪种情况,您都应该将 ViewModel、ViewBag 或 ViewData 中的数据传递给 View,然后只返回“View”。

在这种情况下,最简单的方法是实现 ViewBag。

ViewBag.clone = clone;

return View("Create");

那么从这一点开始应该会返回到下面的URL

Http://localhost:2574/AgentTransmission/CloneAgent/Create

您可以在创建视图中访问您的“克隆”数据,因为 ViewBag 将其 1 次传递给视图。

在传递任何变量之前,我会研究为什么返回没有将您发送到正确的视图。

您还应该确保视图存在并且没有输入错误。视图/AgentClone/Create.cshtml

**编辑:您可能还想修剪您的 AgentID。 URL 的值前有 2 个空格,

http://localhost:2574/AgentTransmission/CloneAgent/0?agentId=**%20%20**11317710

【讨论】:

  • 有几件事:是的,这是一个 GET,但是用户想从已经存在的记录中克隆一些数据。因此,在我们将用户传递到创建页面之前的辅助方法。此外,我要查找的 URL 只是 Http://localhost:2574/AgentTransmission/Create。这个页面目前正在生产中,所以我只是在努力从帮助器ActionResult 方法路由到这个视图。
  • 再次执行不力。你试图用这种方法做太多事情。应使用在传递 id 值“0”时执行克隆的新方法。分解控制器中的方法将大大提高您解决此类问题的能力。从上面的代码中,您是否能够隔离问题?如果你传递一个 ID 是否有效,还是只有在 ID = 0 时才会中断?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2015-02-28
相关资源
最近更新 更多