I am getting the error below:
Child actions are not allowed to perform redirect actions.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: Child actions are not allowed to perform redirect actions.
Source Error:
Line 1: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<RenderActionViewModel>" %>
Line 2: <%Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues); %>
Line 3:
The Stack trace is:
[InvalidOperationException: Child actions are not allowed to perform redirect actions.]
System.Web.Mvc.RedirectResult.ExecuteResult(ControllerContext context) +700064
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +727764
System.Web.Mvc.Controller.ExecuteCore() +159
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +334
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +15
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +52
System.Web.Mvc.<>c__DisplayClass4.<Wrap>b__3() +15
System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +41
System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +1411
[HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.]
System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +2819
System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +275
System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +94
System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +828
System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues) +56
ASP.views_shared_renderaction_ascx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\TFS\PEEP\Src\Main\Hosts\BCA.PEEP.WebSite\Views\Shared\RenderAction.ascx:2
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +131
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +150
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +12742749
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +249
System.Web.UI.Page.Render(HtmlTextWriter writer) +40
System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +65
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +150
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +12742749
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5363
The RenderAction.ascx code where i get the error at line 2 is:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<RenderActionViewModel>" %>
<%Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues); %>
And the Action in the controller is:
public ViewResult DashboardQuicksearch(UserFilter userFilter, bool? showAdvancedSearchLink)
{
int resultCount;
List<KeyInfo<string>> makeList = quickSearchProvider.GetKeysForCriteriaKey(SearchType.Vehicle, "MakeName", userFilter, "null", false, null, out resultCount);
var selectListItems = new List<SelectListItem>();
foreach (KeyInfo<string> item in makeList)
{
selectListItems.Add(new SelectListItem() { Text = item.Key, Value = item.Key, Selected = false });
}
var viewModel = new DashboardQuicksearchViewModel() {
MakeList = (makeList.Count == 1)
? new SelectList(selectListItems, "Value", "Text", selectListItems[0].Value)
: new SelectList(selectListItems, "Value", "Text"),
VehicleCount = quickSearchProvider.GetLotItemCount("null", userFilter),
ShowAdvancedSearchLink = (showAdvancedSearchLink.HasValue ? showAdvancedSearchLink.Value : false)
};
return View(Constants.Views.Search.DashboardQuicksearch, viewModel);
}
I have absolutely no idea how to fix it.
EDIT :
This is the DashboardQuickSearch.ascx
<%@ Control Language="C#" Inherits="BCA.PEEP.Web.UI.ViewUserControlBase<DashboardQuicksearchViewModel>" %>
<%@ Import Namespace="BCA.PEEP.Web.Mvc" %>
<div class="Makes">
<%:(Model.MakeList.Count() == 1
? Html.DropDownList("Makes", Model.MakeList, new {@class="search-select"})
: Html.DropDownList("Makes", Model.MakeList, Html.Text("Name of search results filter:SelectMake"), new {@class="search-select"})
) %>
</div>
<div class="Models"><%:Html.DropDownList("Models", new List<SelectListItem>(), Html.Text("Name of search results filter:SelectModel"), new { disabled = "disabled", @class="search-select"})%></div>
<div class="ResultAndAction">
<span id="VehicleCount" class="VehicleCount"><span class="count-number"><%:Model.VehicleCount.ToString("N0") %></span> <%: Html.Text(Model.VehicleCount, "SearchResultsLabels:Vehicles singular", "SearchResultsLabels:Vehicles plural")%></span>
<div id="QSButtonDiv" class="Button">
<input id="QSButton" type="button" value ="<%:Html.Text("Text on buttons:search")%>" onclick="ExecuteSearch()" disabled="disabled" />
</div>
<% if (Model.ShowAdvancedSearchLink) { %>
<div id="ASButtonDiv" class="Button Hidden">
<input id="ASButton" type="button" value ="<%:Html.Text("Text on links:AdvancedSearch")%>" onclick="AdvancedSearch()" />
</div>
<% } %>
</div>
<script type="text/javascript">
$(document).ready(function () {
var vehiclesSingular = '<%=Html.Text("SearchResultsLabels:Vehicles singular")%>';
var vehiclesPlural = '<%=Html.Text("SearchResultsLabels:Vehicles plural")%>';
var makeCount = '<%=Model.MakeList.Count().ToString("N0") %>';
$('#Makes').change(function () { PopulateModels(); });
$('#Models').change(function () { UpdateVehicleCount(); });
$('#Makes').trigger('change');
function PopulateModels() {
var make = $('#Makes').val();
var $models = $('#Models');
$models.append('<option value="" selected>' + '<%=Html.Text("Name of search results filter:SelectModel") %>' + '</option>');
//alert("Populate Models - Make = '" + make + "'");
if (make == '') {
$models.attr('disabled', 'disabled');
$models.find('option').remove();
$models.append('<option value="" selected>' + '<%=Html.Text("Name of search results filter:SelectModel") %>' + '</option>');
$models.val('');
UpdateVehicleCount();
$('#QSButton').attr('disabled', 'disabled');
$('#QSButtonDiv').removeClass('PrimaryButton').addClass('Button');
return;
}
$.ajax({
type: 'GET',
url: '/Search/GetModelsForMake/',
data: { MakeName: make },
dataType: "json",
success: function (results) {
$models.find('option').remove();
$models.append('<option value="" selected>' + '<%=Html.Text("Labels for vehicle characteristics:All Models") %>' + '</option>');
$(results.Models).each(function (index, model) {
$models.append('<option value="' + model + '">' + model + '</option>');
});
DisplayVehicleCount(results.VehicleCount);
}
});
$models.removeAttr('disabled');
$('#QSButton').removeAttr('disabled', 'disabled');
$('#QSButtonDiv').removeClass('Button').addClass('PrimaryButton');
}
function UpdateVehicleCount() {
var make = $('#Makes').val();
var model = $('#Models').val();
$.ajax({
type: 'GET',
url: '/Search/GetMakeModelCount/',
data: { MakeName: make, ModelName: model },
dataType: "json",
success: function (result) {
DisplayVehicleCount(result);
}
});
}
function DisplayVehicleCount(vehicleCount) {
var vehicles = (vehicleCount == '1') ? vehiclesSingular : vehiclesPlural;
$('#VehicleCount').html('<span class="count-number">' + vehicleCount + '</span>' + ' ' + vehicles);
}
});
function ExecuteSearch() {
var make = $('#Makes').val();
var model = $('#Models').val();
if (make == '')
return;
window.location = '/Quicksearch/Vehicles?make=' + make + '&model=' + model;
}
function AdvancedSearch() {
<% if(AmbientContextHelper.CurrentBrand.Name.ToLower().Contains("alphabet"))
{ %>
window.location = '/SearchVehicle';
<% } else
{ %>
window.location = '/Quicksearch/Vehicles';
<% } %>
}
</script>
This means that:
At this point, ASP.NET is at a loss: it has already started sending headers and HTML to the client, but now it is suddenly told to recall all that and instead send a redirect status code. It obviously cannot do that, so it throws an exception.
You will have to figure out why a redirect is being triggered and make sure that that does not happen. The most likely cause (but by no means the only possible cause) is some custom action filter that hasn't been designed to take child actions into account. ASP.NET MVCs action filters typically check whether the executing action has been called as a child action and avoid redirects in such scenarios.
You should write return PartialView(...)
instead of return View(...)
for a childAction.
The problem was an ActionFilter in ControllerBase class. (i didn't see it the first time)
It was like
[ActionFilters.RequireHttps(RequireSecure = false)]
Had to set it on 'true'
Thank you all for your answers.
Note: Represents the base class for all action-filter attributes Namespace: System.Web.Http.Filters Assembly: System.Web.Http (in System.Web.Http.dll)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With