2015-05-27 2 views
0

Ниже контроллер:MVC метод общественного действия не был найден на контроллере

[HttpPost] 
     public ActionResult Save(HelloWorldMvcApp.ProductData model, string[] imgToDelete) 
     { 
      return Json(new { success = true }); 
     } 

И вот Вид:

@model HelloWorldMvcApp.ProductData model 

    @{ 
     ViewBag.Title = "Edit"; 
     Layout = "~/Views/Shared/_SharedLayout.cshtml"; 
    } 

    <h2>Edit</h2> 

    @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "divProductData", OnSuccess = "hideModal", Url = Html.Action("Save").ToHtmlString() })) 
    { 
     <div id="divProductData"> 
     <table> 
     <tr> 
      <td> 
       @Html.HiddenFor(a => a.id) 
      </td> 
      <td> 
       @Html.TextBoxFor(a => a.productDesc) 
      </td> 
     </tr> 
     <tr> 
      @foreach (string path in Model.picture.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)) 
        { 
         <td> 
          <input type="checkbox" name="imgToDelete" value="@path"> 
          <br /> 
          <img src='~/Images/Product/@path' /> 
         </td> 
        } 
      </tr> 


      </table> 

     </div> 
     } 

    @section scripts{ 
     <script> 
     function hideModal() { 
      $('.modal').modal('hide'); 
      $('body').removeClass('modal-open'); 
      $('.modal-backdrop').remove(); 
     } 
    </script> 
    } 

Существует исключение брошено @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "divProductData", OnSuccess = "hideModal", Url = Html.Action("Save").ToHtmlString() })):

{«Открытый метод действия« Сохранить »не найден на контроллере 'HelloWorldMvcApp.ProductDataController' . "}

Вот скрипка для кода: https://dotnetfiddle.net/OLEq4o

Как исправить эту ошибку?

Я пытался использовать Ajax.BeginForm вместо Html.BeginForm, поскольку эта страница отображается внутри Bootstrap Модальные и после некоторых исследований, я не могу вызвать функцию «hideModal», если я использую Html.BeginForm

Close modal window containing ASP MVC Ajax form

Пожалуйста, поправьте меня, если я ошибаюсь

+2

Если вы желая, чтобы создать URL, то его '@ Url.Action ("Сохранить")', а не '@ Html.Action ("Сохранить")' - 'Html.Action()' называет метод и отображает частичный вид, возвращаемый методом. –

ответ

0

Ох ... Я понял, первый, я переместил имя действия вне AjaxOptions, то я изменил [HttpPost] атрибут [AcceptVerbs(HttpVerbs.Get)] в контроллере, и добавил, JsonRequestBehavior.AllowGet в Результат JSON, вот результат:

https://dotnetfiddle.net/kXnYlT

+1

Если вы действительно выполняете «Сохранить», это обычно действие «POST». Поэтому не стесняйтесь оставить атрибут '[HttpPost]' на контроллере и указать метод в 'AjaxOptions' - новый AjaxOptions {HttpMethod =" POST ", UpdateTargetId =" divProductData ", OnSuccess =" hideModal "}' – ethorn10

0

попробуйте указать имя контроллера.

@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "divProductData", OnSuccess = "hideModal", Url = Html.Action("Save","controllerName").ToHtmlString() })) 
Смежные вопросы