2015-10-02 3 views
0

Я использую AJAX для публикации пользовательского выбора из выпадающего списка назад к запросу action в моем контроллере, который будет возвращать частичный вид. Это работало правильно. Тем не менее, я не могу определить, что я изменилась, и теперь он не с 500 ошибкой:Asp.net MVC Ajax Post - ищет взгляд вместо действия контроллера

The view 'Create_Item_Fields_NoForm' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Request/Create_Item_Fields_NoForm.aspx ~/Views/Request/Create_Item_Fields_NoForm.ascx ~/Views/Shared/Create_Item_Fields_NoForm.aspx ~/Views/Shared/Create_Item_Fields_NoForm.ascx ~/Views/Request/Create_Item_Fields_NoForm.cshtml ~/Views/Request/Create_Item_Fields_NoForm.vbhtml ~/Views/Shared/Create_Item_Fields_NoForm.cshtml ~/Views/Shared/Create_Item_Fields_NoForm.vbhtml

Почему ищет зрения вместо действия контроллера?

Верх моего взгляда

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form" })) 

HTMLDropDownListFor & Div для частичного вида

<div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo"> 
    <div class="panel-body"> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.itemtypes, htmlAttributes: new { @class = "control-label col-md-2" }) 
      @Html.DropDownListFor(model => model.itemtype, (SelectList)Model.myCollection, "Select Type", new { @id = "dropchange", @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.itemtypes, "", new { @class = "text-danger" }) 
     </div> 
    <div id="itemcreate"> 
</div> 

AJAX Сообщение

<script> 
    $(document).ready(function() { 
     $('#dropchange').change(function (e) { 
      e.preventDefault(); 
      var data = $('form').serializeArray(); 
      $.ajax({ 
       //contentType: 'application/json; charset=utf-8', 
       type: 'POST', 
       url: '@Url.Action("Create_Item_Fields_NoForm", "Request")', 
       data: data 
      }).done(function (result) { 
       $("#itemcreate").html(result) 
      }) 
      .fail(function (jqXHR, textStatus, errorThrown) { alert(jqXHR.status, textStatus.toString, errorThrown.toString); }); 
     }); 
    }); 
</script> 

Контроллер ActionResult

[HttpPost] 
public ActionResult Create_Item_Fields_NoForm (vmRequestCreate viewmodel) 
{ 
    if (Request.IsAjaxRequest() && ModelState.IsValid) 
    { 
     if (viewmodel.itemtype.Equals("One")) 
     { 
      return PartialView("_OneCreate"); 
     } 
     else if (viewmodel.extractype.ToString() == "Two") 
     { 
      return PartialView("_TwoCreate"); 
     } 
    } 
    return View(); 
} 
+1

Когда 'ModelState' не является действительным, он попал в' вернуть View(); строка '. Поэтому он попытается вернуть представление с именем «Create_Item_Fields_NoForm» (то есть то же имя, что и ваш метод, потому что вы не указали имя представления). Я предполагаю, что у вас нет представления с этим именем. –

+0

ViewEngine ищет View с ** vbhtml ** extension. Вы меняли с VB на C#? – Win

+0

@ Stephen Muecke Спасибо! Я, должно быть, переместил точку останова, и поэтому я думал, что он никогда не доходит до контроллера. Как я могу пометить ваш комментарий как ответ? – HendPro12

ответ

1

Ваш vmRequestCreate вид модели не является действительным, и в результате вы попали в

return View(); 

строку кода в методе POST. Поскольку вы не указываете имя представления, по умолчанию будет использоваться представление с тем же именем, что и метод контроллера, то есть Create_Item_Fields_NoForm.cshtml, которого нет, следовательно, ошибка. Измените код, чтобы вернуть имя представления, которое существует (или создать представление для Create_Item_Fields_NoForm.cshtml)

return View("yourViewName");