控制器无法路由到正确的视图

时间:2014-04-07 18:58:38

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

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

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

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

return View(modelObj)

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

return View("Create", modelObj)

当我在本地运行网站时,AgentClone工作正常,但浏览器中的网址如下所示

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

当我在服务器上运行时,我获得了相同的URL,但是我没有收到页面加载,而是收到了一条网站崩溃的自定义错误消息。

有人可以帮助return方法使用正确的AgentClone语句吗?

更新

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

AgentClone

    //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控制器中抛出

enter image description here

1 个答案:

答案 0 :(得分:-1)

这似乎从一开始就写得不好。你已经对你的ActionResult发表了评论,这显然是一个获得,但你要回到&#34;创建&#34;图。

无论情况如何,您都应该将ViewModel,ViewBag或ViewData中的数据传递给View,然后返回&#34; View&#34;。

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

ViewBag.clone = clone;

return View("Create");

然后从这一点开始它应该返回到以下URL

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

您可以访问&#34;克隆&#34; ViewBag将创建视图中的数据传递给视图一次。

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

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

**编辑:您可能还想修剪您的AgentID。该URL在其值

之前有2个空格
http://localhost:2574/AgentTransmission/CloneAgent/0?agentId=**%20%20**11317710