查看未找到 - asp.net mvc 错误

Posted

技术标签:

【中文标题】查看未找到 - asp.net mvc 错误【英文标题】:View not found - asp.net mvc error 【发布时间】:2011-08-05 14:59:37 【问题描述】:

我收到一条错误消息,提示尚未找到视图更新,我想显示 TaskDetail 视图而不是更新视图...

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Update(int taskid, string status)
    
        if (!status.Equals("closed", StringComparison.OrdinalIgnoreCase) &&
            !status.Equals("opened", StringComparison.OrdinalIgnoreCase))
            ModelState.AddModelError("", "incorrect status, please try again");

        if (!this.ModelState.IsValid)
            return TaskDetail(taskid);

        if (status.Equals("Closed", StringComparison.OrdinalIgnoreCase))
            _service.CloseTask( taskid, true);
        else
            _service.CloseTask(taskid, false);

        this.FlashInfo("success, task status has been updated...");
        return RedirectToAction("TaskDetail");

例外:

$exception"The view 'Update' or its master was not found. The following locations were searched:\r\n~/Areas/Tasks/Views/TaskManager/Update.aspx\r\n~/Areas/Tasks/Views/TaskManager/Update.ascx\r\n~/Areas/Tasks/Views/Shared/Update.aspx\r\n~/Areas/Tasks/Views/Shared/Update.ascx\r\n~/Views/TaskManager/Update.aspx\r\n~/Views/TaskManager/Update.ascx\r\n~/Views/Shared/Update.aspx\r\n~/Views/Shared/Update.ascx" System.Exception System.InvalidOperationException

任务详情:(这是在同一个控制器内)

    [HttpGet]
    public ActionResult TaskDetail(int taskid)
    
        var loggedonuser = _repo.GetCurrentUser();


        var companies = _repo.All<Company>();
        var users = _repo.All<User>();

        var task = _repo.Single<InstructionTask>
            (x => x.TaskID == taskid && (x.CompanyID == loggedonuser.CompanyID || x.AssignedTo.Contains(loggedonuser.CompanyType.ToString())));

        var dto = new TaskDTO
        
            TaskID = task.TaskID,
            Title = task.Title,
            Description = task.Description,
            DateCreated = task.DateCreated,
            IsClosed = task.IsClosed,
            CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier,
        ;

        var checkedtags = TaskTagsHelper.GetTags(task.AssignedTo);

        var t = TaskTagsHelper.GetPanelTags();

        if (checkedtags != null) //if tags are present only then tick them off...
        
            foreach (var item in t.Keys.ToList())
            
                if (checkedtags.Any(x => x == item))
                    t[item] = true;
            
        

        dto.AvailableTags = t;

        if (task.DueDate.HasValue)
            dto.DueDate = task.DueDate.Value;

        var comments = _repo.All<TaskComment>()
            .Where(x => x.TaskID == task.TaskID)
            .OrderByDescending(x => x.Timestamp)
            .Select(x => new TaskCommentDTO
            
                Comment = x.Comment,
                Timestamp = x.Timestamp,
                CompanyID = companies.Where(y => x.CompanyID == y.CompanyID).SingleOrDefault().Identifier,
                UserID = users.Where(y => x.UserID == y.UserID).SingleOrDefault().Login,
                Type = EnumHelper.Convert<TaskCommentType>(x.Type)
            );

        dto.AllComments = comments;

        return View(new TaskViewModel
        
            TaskDetail = dto,
            NewComment = new TaskCommentDTO()
        );
    

我在我的基本控制器中发现了异常:

    //Generic methods/ controllers/ attributes will be applied here...
    protected override void OnException(ExceptionContext filterContext)
    
        //dont interfere if the exception is already handled
        if (filterContext.ExceptionHandled)
            return;

        //let the next request know what went wrong
        filterContext.Controller.TempData["exception"] = filterContext.Exception;

        //logg exception

        //set up redirect to my global error handler
        filterContext.Result = new ViewResult  ViewName = "~/Views/Error/PublicError.aspx" ;

        //advise subsequent exception filters not to interfere and stop
        // asp.net from showing yellow screen of death
        filterContext.ExceptionHandled = true;

        //erase any output already generated
        filterContext.HttpContext.Response.Clear();
    

【问题讨论】:

【参考方案1】:

根据我对您代码的理解,您正在从 Update 方法调用 TaskDetail 操作。不建议这样做。原因如下:

    请求的所属上下文是 Update 方法,这就是它尝试呈现“Update”视图的原因。这是因为按照惯例,视图是根据被击中的第一个动作来选择的。 MVC 不知道您调用了 TaskDetail。 这违反了 PRG 模式 (Post-Redirect-Get)。我建议您在此处阅读此内容:http://en.wikipedia.org/wiki/Post/Redirect/Get - 基本上,您真的不应该从 HTTP POST 中呈现任何内容。您应该重定向回 GET。不这样做会导致各种问题。

如果您希望它按原样工作,您可以通过将 TaskDetail 的最后一行更改为以下内容来做到这一点,以便它知道始终呈现 TaskDetail 视图,但我不建议这样做:

return View("TaskDetail", ...viewModel...)

【讨论】:

如果我进行重定向,我将如何填充模型状态错误?错误丢失了对吗?模型状态再次变为“有效”,可以这么说??? 如果您的模型状态无效,您不会进行重定向。您只需再次向他们展示表单即可。 您应该将 ModelState 放入 TempData,然后重定向到 GET 并恢复它。有一个完整的框架可以为您处理此处描述的所有内容,因此您不必担心自己管理它:weirdlover.com/2010/07/21/… 基本上,您的 TaskDetail 视图将具有与之关联的 TaskDetailViewModel 强类型模型之类的东西。在您的 TaskDetail 控制器操作中,它将填充此模型并将其返回到视图,例如:TaskDetailViewModel model = new TaskDetailViewModel();返回视图(模型);如果您的模型状态在 POST to Update 上无效,您只需重新创建模型并返回视图,但由于您正在 POST 到 Update,您需要指定视图:return View("TaskDetail", model) ; @Dismissile:你错了。您应该将其放入 TempData 并重定向。如果你按下 F5 会发生什么,或者如果你在 POST 动词期间渲染一些东西,会发生什么?玩玩看看。【参考方案2】:

那么显而易见的问题是:

您在以下文件夹之一中有文件吗:

Views\ControllerName\TaskDetail.aspx
Views\ControllerName\TaskDetail.ascx
Views\Shared\TaskDetail.aspx
Views\Shared\TaskDetail.ascx

其中 ControllerName 是您的 Update 方法所在的控制器的名称。也就是说,如果您的控制器是 HomeController,那么您的文件夹就是 \Views\Home\

编辑: 我对您的 ModelState.IsValid 调用也有些困惑,但主要是因为您没有包含 TaskDetail 控制器操作。如果您的模型状态无效,您是否不想返回更新视图以便用户可以更正错误并重新提交?还是他们从 TaskDetail POST 到 Update 操作?

【讨论】:

是的,他们正在从 TaskDetail 发布到 Update,TaskDetail 是 Get 请求,其中可能会发生多个表单发布,例如UpdateTask, AddComment... 我确实有查看 TaskDetail 好的,这个异常发生在哪里。是在 RedirectToAction 调用上失败还是在 TaskDetail 调用上失败?是 AJAX 调用还是常规请求失败? 这是一个简单的 FormPost,令人惊讶的错误仅在 Exception 的基本控制器内部被捕获(参见上面的代码)... 我的意思是异常的来源。是因为 RedirectToAction 调用还是发生在 return TaskDetail() 调用或其他地方?它是在每种情况下都失败还是仅在一条路径中失败。可能有助于缩小问题范围。 会发生什么:当模型状态无效时'return TaskDetail(taskid);'运行,没有发生异常,代码成功调用任务详细信息的get请求,完成所有工作并毫无失败地到达方法的末尾,我继续单步执行代码,没有发生任何有趣的事情/甚至没有抛出异常,然后我到达基本控制器 OnException 我可以在 filtercontext 中看到错误...

以上是关于查看未找到 - asp.net mvc 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ASP.NET MVC 处理“未找到 404 页面”查询的全部路由?

未找到注释“SqlServer:Include”。确保注释已添加 ASP.Net MVC

ASP.NET MVC 4,Web API - 404 未找到

Asp.Net Mvc Filemanager 调用未定义函数错误

ASP.net MVC Core Razor 页面和 Ajax JQuery

未记录 ELMAH 和 ASP.NET MVC 自定义错误