I am getting this 500 error:
Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 500
UPDATE:
My Error is actually this:
System.Web.UI.ViewStateException
if (viewStates.Length != list.Items.Count + 1)
{
throw new ViewStateException();
}
I have been getting it ever since I added this adapter to my site that is shown on this tutorial.
ASP.NET DropDownList with OptionGroup support
It loads the DropDownList just fine in all pages but when I do any postbacks, regular or ajax is when the error appears. Here is my exact code for the adapter and the browser file.
Adapter Class
public class DropDownListAdapter : WebControlAdapter
{
private const string OptionGroupAttribute = "OptionGroup";
private const string TagOptionGroup = "optgroup";
private const string AttributeLabel = "label";
protected override void RenderContents(HtmlTextWriter writer)
{
DropDownList list = Control as DropDownList;
string currentOptionGroup;
List<string> renderedOptionGroups = new List<string>();
foreach (ListItem item in list.Items)
{
Page.ClientScript.RegisterForEventValidation(
list.UniqueID,
item.Value);
if (item.Attributes[OptionGroupAttribute] == null)
{
RenderListItem(item, writer);
}
else
{
currentOptionGroup = item.Attributes[OptionGroupAttribute];
if (renderedOptionGroups.Contains(currentOptionGroup))
{
RenderListItem(item, writer);
}
else
{
if (renderedOptionGroups.Count > 0)
{
RenderOptionGroupEndTag(writer);
}
RenderOptionGroupBeginTag(currentOptionGroup, writer);
renderedOptionGroups.Add(currentOptionGroup);
RenderListItem(item, writer);
}
}
}
if (renderedOptionGroups.Count > 0)
{
RenderOptionGroupEndTag(writer);
}
}
private void RenderOptionGroupBeginTag(string name, HtmlTextWriter writer)
{
writer.AddAttribute(AttributeLabel, name);
writer.RenderBeginTag(TagOptionGroup);
}
private void RenderOptionGroupEndTag(HtmlTextWriter writer)
{
writer.RenderEndTag();
}
private void RenderListItem(ListItem item, HtmlTextWriter writer)
{
foreach (string key in item.Attributes.Keys)
{
if (key != OptionGroupAttribute)
{
writer.AddAttribute(key, item.Attributes[key]);
}
}
writer.AddAttribute(HtmlTextWriterAttribute.Value, item.Value, true);
if (item.Selected)
{
writer.AddAttribute(HtmlTextWriterAttribute.Selected, "selected");
}
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.WriteEncodedText(item.Text);
writer.RenderEndTag();
}
protected override object SaveAdapterViewState()
{
DropDownList list = Control as DropDownList;
object[] viewStates = new object[list.Items.Count + 2];
int i = 0;
foreach (ListItem item in list.Items)
viewStates[i++] = item.Attributes[OptionGroupAttribute];
viewStates[i++] = base.SaveAdapterViewState();
viewStates[i] = Hash(list.Items);
return viewStates;
}
private static int Hash(ListItemCollection listItems)
{
int hash = 0;
foreach (ListItem listItem in listItems)
hash += listItem.GetHashCode();
return hash;
}
object[] viewStates;
protected override void LoadAdapterViewState(object state)
{
viewStates = (object[])state;
base.LoadAdapterViewState(viewStates[viewStates.Length - 1]);
}
protected override void OnPreRender(System.EventArgs e)
{
if (viewStates != null && viewStates.Length > 1)
{
DropDownList list = Control as DropDownList;
if (Page.EnableEventValidation)
{
if (viewStates.Length != list.Items.Count + 1)
{
throw new ViewStateException();
}
}
if (Hash(list.Items) == (int)viewStates[viewStates.Length - 1])
{
int max = viewStates.Length - 2;
if (list.Items.Count < max)
{
max = list.Items.Count;
}
for (int i = 0; i < max; i++)
{
list.Items[i].Attributes[OptionGroupAttribute] =
(string)viewStates[i];
}
}
}
base.OnPreRender(e);
}
}
Browser File:
<browsers>
<browser refID="default">
<controlAdapters>
<adapter
controlType="System.Web.UI.WebControls.DropDownList"
adapterType="DropDownListAdapter" />
</controlAdapters>
</browser>
</browsers>
StackTrace
NopSolutions.NopCommerce.Web.DropDownListAdapter.OnPreRender(EventArgs e) in ...
// I'm guessing the issue is here
System.Web.UI.Control.PreRenderRecursiveInternal() +8948774
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Control.PreRenderRecursiveInternal() +175
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2496
If anyone can point me in the right direction on how to fix this that would be awesome. Now please don’t tell me to disable validateRequest because that doesn’t solve the problem it just covers it up.
You probably already solved this problem or just followed another path, but for future reference.
In
SaveAdapterViewStateyou save state to an object array with a length ofx + 2:Then, in
LoadAdapterViewStateyou initialize a local fieldviewStateswith the object array coming from view state:Finally, in
OnPreRenderyou’re ensuring that the local fieldviewStateshas a length ofx + 1which will fail because you saved an array of lengthx + 2and that’s what you’ll get when you load it from view state.