__doPostBack only works if there is a LinkButton, Calendar or WizardStep control on the page
<p>I have identified a problem with __doPostBack and found a work around. I am seeking an explanation for the cause and/or a better solution than my work around.</p>

<p><strong>Scenario:</strong>
I have a dropdown populated with the values; "-Select-", "One" &amp; "Two". If the user selects "One" than client side script is executed. If the user selects "Two" than server side script is executed.</p>

<p><strong>Problem:</strong>
The client script initiates the postback by calling __doPostBack. However, no post back actually occurs unless there is also a LinkButton, Calendar or WizardStep control on the page. I actually went through all of the standard tools in the Visual Studio Toolbox and tested them all. It has to be one of those three.</p>

<p><strong>Work Around:</strong>
Add a link button surrounded by a span with display set to none.</p>

<pre><code>&lt;span style="display:none;"&gt;
    &lt;asp:LinkButton ID="LinkButton1" runat="server"&gt;LinkButton&lt;/asp:LinkButton&gt;
&lt;/span&gt;
</code></pre>

<p><strong>Question:</strong> Can somebody provide an explanation for this behavior or provide a better fix than my "Work Around"? </p>

<p><strong>Source - Javascript</strong> (I placed it between the head tags)</p>

<pre><code>&lt;script language="javascript" type="text/javascript"&gt;
    function DropDownList1_change(elementRef) {
        var selectedIndex = elementRef.selectedIndex;
        if (selectedIndex &gt; 0) {
            var selectedValue = elementRef.options[selectedIndex].value;
            if (selectedValue == "One") {
                alert("Because you selected 'One', special javascript code will be executed");
                // Special javascript code goes here
                return;
            }
            else if (selectedValue == "Two") {
                // Special server code gets executed on server DropDownList1_SelectedIndexChanged
                __doPostBack('DropDownList1', '');
            }
        }
    }
&lt;/script&gt;
</code></pre>

<p><strong>Source - ASPX Controls</strong></p>

<pre><code>    &lt;asp:DropDownList ID="DropDownList1" runat="server"  onchange="DropDownList1_change(this)" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"&gt;
        &lt;asp:ListItem&gt;-Select-&lt;/asp:ListItem&gt;
        &lt;asp:ListItem&gt;One&lt;/asp:ListItem&gt;
        &lt;asp:ListItem&gt;Two&lt;/asp:ListItem&gt;
    &lt;/asp:DropDownList&gt;
    &lt;br /&gt;

    &lt;!-- For some unknown reason __doPostBack only works if there is a LinkButton, Calendar or WizardStep control on the page --&gt;      
    &lt;span style="display:none;"&gt;
        &lt;asp:LinkButton ID="LinkButton1" runat="server"&gt;LinkButton&lt;/asp:LinkButton&gt;
    &lt;/span&gt;

    Time of last Post Back: &lt;asp:Label ID="Label1" runat="server"&gt;&lt;/asp:Label&gt;&lt;br /&gt;
    Time of OnSelectedIndexChanged: &lt;asp:Label ID="Label2" runat="server"&gt;&lt;/asp:Label&gt;
</code></pre>

<p><strong>Source - Code Behind</strong></p>

<pre><code>    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToLongTimeString();
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Label2.Text = DateTime.Now.ToLongTimeString();
    }
</code></pre>

<p><strong>Additional Resource</strong> - I found the following article after posting this question. Its a very old Microsoft article and the only Microsoft article I found that mentions the specific limitation of DropDowns, return values &amp; postbacks. I haven't digged deep into their solution and not sure time will allow me to. Mainly posting it in case my solution fails down the road or doesn't work for someone else.</p>

<blockquote>
  <p>Intuitively you might think adding a confirm dialog box for a
  DropDownList is identical to adding such a dialog box for a Button Web
  control. That is, simply set the DropDownList's client-side onchange
  attribute to something like: return confirm(...);. using:
  DropDownListID.Attributes("onchange") = "return confirm(...);"
  Unfortunately, this won't work as desired because an AutoPostBack
  DropDownList's onchange attribute will be set to a bit of JavaScript
  that causes a postback, namely a call to the client-side __doPostBack
  function. When setting the onchange attribute programmatically
  yourself, the end result is that the rendered client-side onchange
  event handler has both your code and the call to __doPostBack:</p>
</blockquote>

<p>The article is long so search for "Confirmation with AutoPostBack DropDownLists" </p>

<p><a href="https://msdn.microsoft.com/en-us/library/aa479302.aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/aa479302.aspx</a></p>