Html.Action не отображает методы действия, аннотированные с помощью [HttpPost] - PullRequest
3 голосов
/ 06 января 2012

У меня есть следующий метод на моем контроллере:

  [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>

Но это дает ошибку: метод открытого действия 'UnplannedCourses'не был найден в контроллере 'Digidos.MVCUI.Controllers.StudentController'.

Если я пропущу [HttpPost], то это будет работать, но позже я снова использую действие из javascript, поэтому я хотел бы иметь толькоPOST доступно.

Любые иды?

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Я думаю, что моя лучшая ставка - это новый атрибут, основанный на источниках 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);
}
2 голосов
/ 06 января 2012

Html.Action является вспомогательным методом html и вызывает действие вашего контроллера с помощью Http GET not POST.

Html.Action является вспомогательным методом html и вызывает ваш контроллердействие, которое принимает GET запросов.

Редактировать:

Если вы хотите защитить эту страницу от просмотра через браузер, добавьте атрибут ChildActionOnly следующим образом:

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

Редактировать:

Если вы хотите вызвать свое действие через Http POST через JavaScript, посмотрите следующий пост:

Работа с JQuery Ajax API в ASP.NET MVC 3.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...