【问题标题】:Not able to return a view for [HttpPost] method无法返回 [HttpPost] 方法的视图
【发布时间】:2023-03-16 04:45:01
【问题描述】:

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

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>

【问题讨论】:

  • 您是否真的在向/Student/SubmitStudent 发布内容。我认为我们错过了一些东西。
  • 请提供您的提交按钮/链接信息。
  • 对不起,这里是:



  • @mootinator:是的,我们在提交时通过 webformt textarea 向 /Student/SubmitStudent 发布一些内容

标签: asp.net-mvc view controller


【解决方案1】:

这里有几点需要考虑。

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

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

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

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

【讨论】:

  • 好的,我正在将视图重定向到 [HttpGet] 方法来呈现我的视图,如何将 [HttpPost] 方法 SubmitStudent 中的参数显示到 [HttpGet] 方法 DisplayStudent?
  • 这是一个好方法吗? [HttpPost] public ActionResult SubmitStudent() { StudentViewModel model = TempData["model"] as StudentResponseViewModel; TempData["id"] = model.Id; TempData["name"] = model.Name; return RedirectToAction("DisplayStudent"); }[HttpGet] public ActionResult DisplayStudent() { ViewData["id"] = TempData["id"]; ViewData["name"] = TempData["name"]; return View(); }
  • 查看:&lt;%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %&gt; &lt;html&gt; &lt;head runat="server"&gt; &lt;title&gt;DisplayStudent&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div&gt; &lt;%= ViewData["id"]%&gt; &lt;br /&gt; &lt;%= ViewData["name"]%&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;
  • 在 cmets 中发布的代码难以阅读。无论如何,在 MvcContrib 项目中有一个有趣的动作过滤器,它有助于 PRG 模式。它被称为“ModelStateToTempData”,基本上,在验证错误的情况下,在您的发布操作期间将您的模型状态序列化到临时数据中,并在下一个 GET 方法中自动将其反序列化。
【解决方案2】:

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

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

这一行也令人困惑:

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

你的意思是:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2011-09-10
      • 2016-04-04
      • 2021-01-10
      相关资源
      最近更新 更多