Html.Action不会呈现使用[HttpPost]注释的actionmethods

时间:2012-01-06 10:03:20

标签: asp.net-mvc asp.net-mvc-3

我的控制器上有以下方法:

  [HttpPost]
  public ActionResult UnplannedCourses(int studentId)
  {
     var model = CreateUnplannedCourseModel(studentId);
     return View("UnplannedCourses", model);
  }

在我看来我试试:

  <div class="unplannedcourses">
  @Html.Action("UnplannedCourses", "Student", new { studentId = Model.StudentId })
  </div>

但是这给出了一个错误:在控制器'Digidos.MVCUI.Controllers.StudentController'上找不到公共操作方法'UnplannedCourses'。

如果我将[HttpPost]退出,那么它可以正常工作,但我稍后会从javascript中再次使用该操作,因此我希望只提供POST。

任何想法?

2 个答案:

答案 0 :(得分:3)

我认为我最好的选择是基于MVC来源的新属性:

public class ChildishAttribute : ActionMethodSelectorAttribute
{
   private static readonly AcceptVerbsAttribute _innerAttribute = new AcceptVerbsAttribute(HttpVerbs.Post);
   public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
   {
      var isPost = _innerAttribute.IsValidForRequest(controllerContext, methodInfo);
      var isChildAction = controllerContext.IsChildAction;
      var isAjax = controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();

      return isChildAction || (isAjax && isPost);
  }
}

[Childish]
public ActionResult UnplannedCourses(int studentId)
{
   var model = CreateUnplannedCourseModel(studentId);
   return View("UnplannedCourses", model);
}

答案 1 :(得分:2)

Html.Action是一个html帮助方法,并使用Http GET而非POST来调用您的控制器操作。

Html.Action是一个html辅助方法,可以调用接受GET个请求的控制器操作。

修改

如果您打算通过浏览器保护该页面不被查看,请按以下方式实施ChildActionOnly属性:

  [ChildActionOnly]
  public ActionResult UnplannedCourses(int studentId)
  {
     var model = CreateUnplannedCourseModel(studentId);
     return View("UnplannedCourses", model);
  }

修改

如果您想通过JavaScript通过Http POST调用您的操作,请查看以下帖子:

Working With JQuery Ajax API on ASP.NET MVC 3.0