在控制器中使用“HttpPost”时出现资源未找到错误

4

你好
我正在处理一个ASP.Net MVC 3项目,但是遇到了一个错误,提示“资源无法找到”。我的情况是:

  • 我使用自己的视图,并在操作中返回它们。例如,我首先手动创建了一个名为“Create.cshtml”的视图,并将其手动添加到一个操作中,如下所示:
[HttpPost]
 Public ActionResult CreateStudent(StudentIfo studentinfo)
{
 db.StudentInfo.add(studentinfo);
 db.SaveChanges();
Return View("~/Views/Student/Create.cshtml");
}

[HttpGet]这个Action之前工作良好,但为什么不是HttpPost?

我的路由地图说:

routes.MapRoute(" ",
                "{controller}/{action}/{id}",
                new { controller = "Student", action = "CreateStudent", id = UrlParameter.Optional }
                );

2: 每当我写[HttpPost]时,就会出现此错误,如果我删除它,则一切正常,如果这种情况继续下去,那么如何保存数据?

3: 我的Create.cshtml有一个@Html.BeginForm("CreateStudent","Student",FormMethod.Post),我不知道问题是什么?我已经搜索了很多,但没有得到一个好的答案。

4: 当我们使用自己的视图而不是使用Visual Studio脚手架模板进行CURD操作时,最好的方法是什么,即我的方式是否正确?我想要自己的视图,然后根据它们编写我的控制器,而不是像Visual Studio那样先编写控制器,然后右键单击“添加视图”

请推荐一些关于此方面的好方法、网站或教程。


请阅读:http://stackoverflow.com/editing-help#comment-formatting - tereško
感谢@tereško提供的链接,但由于我是论坛新手,不熟悉该格式,所以不知道如何操作。再次感谢! - sam
没问题。记住,当你使用 [HttpPost] 装饰方法时,该方法只能在 POST 请求(ajax请求使用方法:post或表单提交)时被调用。你将无法通过在浏览器中输入该路径来访问它。那是一个 GET 请求。 - Tommy
1个回答

2
简而言之,您需要同时拥有[HttpGet]操作和[HttpPost]版本。[HttpGet]操作用于返回用户可以输入值的初始表单,而[HttpPost]版本用于进行数据持久化。在[HttpPost]方法中,您应该使用RedirectToAction(return RedirectToAction(...))来确保页面重新加载时不会重新运行提交操作。
因此:
[HttpGet]
public ActionResult CreateStudent()
{
    var viewModel = new CreateStudentViewModel { /* Set properties here or load data for it */ };
    return View(viewModel);
}

[HttpPost]
public ActionResult CreateStudent(PostedValues values)
{
    if (ModelState.IsValid)
    {
        // Create Student Here
        return RedirectToAction(/* Jump to a logical place with a Get */)
    }

    /* Initialize correct error viewModel again and show the create student screen with validation errors */
    return View(viewModel)
}

我个人称这些方法为GetCreateStudent和PostCreateStudent,并添加两个路由,使用路由约束来限制Http方法(请参见此处)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接