Просмотр не найден - asp.net ошибка MVC - PullRequest
0 голосов
/ 05 августа 2011

Я получаю сообщение о том, что представление Обновление не найдено, я хотел показать представление 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();
    }

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Из того, что я понимаю в вашем коде, вы вызываете действие TaskDetail из метода Update.Это не рекомендуется.Вот почему:

  1. Собственный контекст запроса - это метод Update, поэтому он пытается отобразить представление «Update».Это потому, что по соглашению вид выбирается на основании первого действия, которое было достигнуто.MVC не знает, что вы назвали TaskDetail.
  2. Это нарушение шаблона PRG (Post-Redirect-Get).Я предлагаю вам прочитать об этом здесь: http://en.wikipedia.org/wiki/Post/Redirect/Get - По сути, вы действительно не должны ничего делать из HTTP POST.Вы должны перенаправить обратно на GET.Это вызывает всевозможные проблемы, не делая этого.

Если вы хотите, чтобы он работал как есть, вы можете сделать это, изменив последнюю строку TaskDetail на следующую, чтобы он всегда знал, что нужно рендеритьпредставление TaskDetail, но я не рекомендую его:

return View("TaskDetail", ...viewModel...)
1 голос
/ 05 августа 2011

Ну, очевидный вопрос:

У вас есть файл в одной из следующих папок:

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

Где ControllerName - имя контроллера, в котором находится ваш метод Update.То есть, если вашим контроллером является HomeController, то ваша папка будет \ Views \ Home \

Edit:
Я также немного запутался в вашем вызове ModelState.IsValid,но в основном потому, что вы не включили действие контроллера TaskDetail.Если ваше состояние модели недействительно, не хотите ли вы вернуть представление «Обновление», чтобы пользователь мог исправить свои ошибки и повторно отправить?Или они отправляют сообщения из TaskDetail в действие Update?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...