无法返回[HttpPost]方法的视图

时间:2011-07-13 15:30:59

标签: asp.net-mvc view controller

返回视图时出现以下错误:

Server Error in '/' Application.
--------------------------------------------------------------------------------

The view 'student' or its master was not found. The following locations were searched:
~/Views/Student/student.aspx
~/Views/Student/student.ascx
~/Views/Shared/student.aspx
~/Views/Shared/student.ascx

这是我的控制器动作:

[HttpPost]
    public ActionResult SubmitStudent()
    {
        StudentViewModel model = TempData["model"] as StudentResponseViewModel;

        ViewData["id"] = model.Id;
        ViewData["name"] = model.Name;

        string comment = Request["comment"];

        var student = student.studentTable.Where(s => s.studentId == model.Id);

        return View(student);
    }

这是我的观点:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<string>>" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Student</title>
</head>
<body>
<div>
Student name listed below:
</div>

<table>

<% foreach (var item in Model) { %>
     <tr>
        <td>
            <%= Html.Encode(item)%>
        </td>
    </tr>

<% } %>

</table>
</body>
</html>

3 个答案:

答案 0 :(得分:2)

这里要考虑的一些事情。

首先,在HTTP POST之后返回视图实际上是一个糟糕的设计选择。你可以谷歌关于PRG模式,你会发现很多文章,可以解释为什么你应该总是重定向到HTTP GET,它将呈现你的视图。

其次,我发现您的代码正在寻找视图名称“student”。根据MVC规范,控制器将查找一个名为action方法的视图,除非调用接受视图名称作为参数的View()方法的重载(这不是你的情况,至少在你发布的代码中没有) )。

在您的示例中,似乎应该查找名为“SubmitStudent”的视图。同样,您在视图中声明的模型类型与您传递给它的模型不匹配。它接受IEnumerable<string>,但您传递给IQueryable<Student>(这是您的学生变量包含的内容)。

我认为您省略了代码的某些部分。您发布的部分彼此不完全匹配。

答案 1 :(得分:1)

您的观点必须在"Views\Student\" - 除非您更改了我认为您没有的视图引擎设置。

所以我相信你的观点不存在。

答案 2 :(得分:1)

为了让您的代码正常工作,您需要在SubmitStudent.aspxViews\Student\个文件夹中使用名为Views\Shared\的视图。

您的视图继承了字符串列表而不是Student对象或查询返回的任何类型的对象,这看起来很奇怪。您的视图需要一个string的可列举列表

这一行也令人困惑:

var student = student.studentTable.Where(s => s.studentId == model.Id);

你的意思是:

var student = model.studentTable.Where(s => s.studentId == model.Id);