如何将视图重定向到同一Controller上的另一个操作

时间:2016-10-05 13:59:54

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5

我有一个名为StudentController的控制器,Index.cshtml和中央layout.cschtml,

我在很长一段时间后都在进行前端开发,在asp.net mvc的前端工作现在对我来说很安静,所以如果出现问题请原谅我。

我想要实现的是,当我运行我的应用程序时,它运行完美查找,但是当我单击链接学生时,它成功转到学生索引视图并点击索引方法StudentController。

但是当我点击索引视图上的“创建新”链接时,它会出错(请参见下方),有人可以指导我做错了吗....

StudentController

public StudentController(){}
public ActionResult Index()
{            
    var students =_studentDb.GetAll();            
    return View(students);
}

[HttpPost]
public ActionResult Create(Student student)
{
    var result = _studentDb.Insert(student);
    return View("Create");
}

_layout.chtml

 <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", new { Controller = "Home", Area = "Common" })</li>                    
                    <li>@Html.ActionLink("Student", "Index", new { Controller = "Student", Area = "User" })</li>
                    <li>@Html.ActionLink("New Student", "Index", new { Controller = "CreateStudent", Area = "User" })</li>
                </ul>

Index.chtml

@model IEnumerable<Student>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create",new {Controller="Student",Area="User" })        
</p>
<table class="table">
    <tr>        
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.MiddleName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Gender)
        </th>        
        <th>
            @Html.DisplayNameFor(model => model.FirstNameAr)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.MiddleNameAr)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastNameAr)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>        
        <td>
            @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MiddleName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>        
        <td>
            @Html.DisplayFor(modelItem => item.FirstNameAr)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MiddleNameAr)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastNameAr)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>
    </tr>
}

</table>

错误

Server Error in '/' Application.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /User/Student/Create

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0

4 个答案:

答案 0 :(得分:2)

您收到错误是因为您正在为帖子操作生成<a>标记。您只能通过javascript中的表单帖子或ajax访问帖子操作。如果您尝试链接到其他类似的视图,则需要删除[HttpPost]属性。此外,您似乎希望将result传递到您的创建视图中,例如:return View(result)(使用此重载,因为您的视图与您的操作具有相同的名称)。此外,您的Create操作具有Student参数,但您没有将值传递给它。我建议使用更像以下结构:

public IActionResult Create() 
{
    var student = new Student();
    return View(student)
}

[HttpPost]
public IActionResult Create(Student student)
{
    _studentDb.Add(student);
    _studentDb.SaveChanges();
    // Do whatever you like to finish this action
}

然后您的“创建”视图应包含一个表单,用于输入有关将发布到/用户/学生/创建的学生的数据。

答案 1 :(得分:2)

像这样改变代码

pyplot

答案 2 :(得分:1)

首先,您需要在控制器上使用两种方法,一种用于GET,另一种用于POST。你只有POST。

GET将返回您在此处的创建视图,因此请更改HttpPost属性。

[HttpGet]
public ActionResult Create()
{
  return View("Create");
}

如果您希望Controller Action A返回Controller Action B,则返回RedirectToAction()而不是View()

答案 3 :(得分:1)

通常你需要两个动作:

  1. 一个GET操作,显示用户将进入的屏幕 创建新实体所需的值。这将有一个表格, 提交时会发送到......
  2. 接受表单提交的POST操作,检查 防伪令牌,并进行实际数据操作(添加 用户进入数据库)。另外一个最佳实践是 重定向到GET操作(例如RedirectToAction返回索引 行动)避免双重发布 (https://en.wikipedia.org/wiki/Post/Redirect/Get
  3. 您只有POST操作...您无法链接到该操作,您需要将其作为表单提交。所以你也需要创建GET动作。