2013-09-18 10 views
0

Я задал этот вопрос ранее аналогичным образом, этот вопрос по-прежнему остается нерешенным. У меня есть dropdownlist, заполненный локальной базой данных. Когда пользователи выбирают параметр, обновление страницы и индекс возвращаются к первому варианту. Когда это происходит, метод SelectedIndexChanged не срабатывает, при отладке я обнаружил, что на загрузке страницы! IsPostBack всегда прав.Asp.net Dropdownlist Page_Load isPostBack = False

У меня есть enableviewstate true для страницы, выпадающего списка и для базы данных. вместе с AutoEventWireUp true для страницы.

Пожалуйста, помогите, я уже придерживался этой проблемы уже около недели! Я чувствую, что проблема может сохраниться в моей главной странице или в файле web.config, так что больной опубликуем, а

index.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<BenchmarkApp.Models.Benchmark>>" AutoEventWireup="true" EnableViewState="true"%> 

<!DOCTYPE html> 

<script runat="server"> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged); 

    if (!this.IsPostBack) 
    { 
     Response.Write("Post Back is False"); 
     bindData(); 
    } 
} 

protected void bindData() 
{ 
    DropDownList1.Items.Clear(); 
    DropDownList1.DataSourceID = "SqlDataSource1"; 
    DropDownList1.DataTextField = "Version"; 
    DropDownList1.DataValueField = "Id"; 
    DropDownList1.DataBind(); 
} 

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Response.Write((sender as DropDownList).SelectedItem.Text); 
    Label1.Text = DropDownList1.SelectedItem.Text; 
} 

</script> 

<html> 

<head runat="server"> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Benchmark</title> 
</head> 

<body> 

    <form id="bmform" runat="server"> 

<p> 
    <%: Html.ActionLink("Create New", "Create") %> 
</p> 
<table border="1"> 
    <tr> 
     <th> 
      Build version: 
     </th> 
     <th> 
      <%-- Html.DropDownList("Builds", null, new {@onchange = "onChange(this.value);" }) --%> 
      <%-- Html.DropDownList("BuildID", (SelectList) ViewBag.Builds, "--Select One--") --%> 
      <%-- Html.DropDownList("BuildDD", (IEnumerable<SelectListItem>)ViewBag.Builds, "--Select One--") --%> 

      <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
       DataSourceID="SqlDataSource1" DataTextField="Version" 
       onselectedindexchanged="DropDownList1_SelectedIndexChanged" 
       DataValueField="Id"> 
      </asp:DropDownList> 
      <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
       ConnectionString="<%$ ConnectionStrings:DAContext %>" 
       SelectCommand="SELECT [Id], [Version] FROM [Builds]"></asp:SqlDataSource> 
     </th> 
     <th> 
      <asp:Label ID="Label1" runat="server" Text= "--Build Version--"></asp:Label> 
     </th> 
    </tr> 
</table> 

<table border="1"> 
    <tr> 
     <th> 
      <%: Html.DisplayNameFor(model => model.Script.Name) %> 
     </th> 
     <th> 
      <%: Html.DisplayNameFor(model => model.Build.Version) %> 
     </th> 
     <th> 
      <%: Html.DisplayNameFor(model => model.MinTime) %> 
     </th> 
     <th> 
      <%: Html.DisplayNameFor(model => model.MeanTime) %> 
     </th> 
     <th> 
      <%: Html.DisplayNameFor(model => model.MaxTime) %> 
     </th> 
     <th> 
     </th> 
    </tr> 
    <% foreach (var item in Model) 
     { %> 
    <tr> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.Script.Name) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.Build.Version) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.MinTime) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.MeanTime) %> 
     </td> 
     <td> 
      <%: Html.DisplayFor(modelItem => item.MaxTime) %> 
     </td> 
     <td> 
      <%: Html.ActionLink("Edit", "Edit", new { id=item.BenchmarkID }) %> 
      | 
      <%: Html.ActionLink("Details", "Details", new { id=item.BenchmarkID }) %> 
      | 
      <%: Html.ActionLink("Delete", "Delete", new { id=item.BenchmarkID }) %> 
     </td> 
    </tr> 
    <% } %> 
</table> 

    </form> 

</body> 
</html> 

Мастер

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" AutoEventWireup="true" EnableViewState="true" %> 
<!DOCTYPE html> 
<html lang="en"> 
    <head runat="server"> 
     <meta charset="utf-8" /> 
     <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
    <link href="<%: Url.Content("~/favicon.ico") %>" rel="shortcut icon" type="image/x-icon" /> 
    <meta name="viewport" content="width=device-width" /> 
    <%: Styles.Render("~/Content/css") %> 
    <%: Scripts.Render("~/bundles/modernizr") %> 
</head> 
<body> 

<form id="master" runat="server"> 

    <header> 
     <div class="content-wrapper"> 
      <div class="float-left"> 
       <p class="site-title"><%: Html.ActionLink("your logo here", "Index", "Home") %></p> 
      </div> 
      <div class="float-right"> 
       <section id="login"> 
        <%: Html.Partial("_LoginPartial") %> 
       </section> 
       <nav> 
        <ul id="menu"> 
         <li><%: Html.ActionLink("Home", "Index", "Home") %></li> 
         <li><%: Html.ActionLink("About", "About", "Home") %></li> 
         <li><%: Html.ActionLink("Contact", "Contact", "Home") %></li> 
        </ul> 
       </nav> 
      </div> 
     </div> 
    </header> 
    <div id="body"> 
     <asp:ContentPlaceHolder ID="FeaturedContent" runat="server" /> 
     <section class="content-wrapper main-content clear-fix"> 
      <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
     </section> 
    </div> 
    <footer> 
     <div class="content-wrapper"> 
      <div class="float-left"> 
       <p>&copy; <%: DateTime.Now.Year %> - My ASP.NET MVC Application</p> 
      </div> 
     </div> 
    </footer> 

    <%: Scripts.Render("~/bundles/jquery") %> 
    <asp:ContentPlaceHolder ID="ScriptsSection" runat="server" /> 

    </form> 

</body> 
</html> 

Web.config

<?xml version="1.0"?> 

<configuration> 
    <configSections> 
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 

    <system.web.webPages.razor> 
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
<pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Optimization"/> 
    <add namespace="System.Web.Routing" /> 
    </namespaces> 
    </pages> 
    </system.web.webPages.razor> 

    <appSettings> 
<add key="webpages:Enabled" value="false" /> 
    </appSettings> 

    <system.web> 
    <httpHandlers> 
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

<!-- 
    Enabling request validation in view pages would cause validation to occur 
    after the input has already been processed by the controller. By default 
    MVC performs request validation before a controller processes the input. 
    To change this behavior apply the ValidateInputAttribute to a 
    controller or action. 
--> 
    <pages 
     validateRequest="false" 
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    <controls> 
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> 
    </controls> 
    </pages> 
    </system.web> 

    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 

    <handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 
    </system.webServer> 
</configuration> 

спасибо, что заблаговременно !!

+3

Почему вы смешиваете MVC и WebForms? – afzalulh

+1

Пожалуйста, не повторяйте [тот же вопрос] (http://stackoverflow.com/questions/18834885/asp-net-dropdownlist-ispostback-is-alwasy-false) только потому, что вы не получили ответов. Не стесняйтесь использовать ссылку «Изменить» по этому вопросу, чтобы обновить ее с помощью любой новой информации, которую вы получили. – jadarnel27

ответ

1

Как уже упоминалось выше, вы не можете использовать управление asp в приложении MVC. (ну это не сработало для меня). Вместо этого я переключил свое приложение для использования Бритвы Engine и напечатал это в View.cshtml:

@using (Html.BeginForm("FilterBenchmarks", "Benchmark", FormMethod.Post)) 
{ 

<table border="1"> 
    <tr> 
     <th> 
      Build version: 
     </th> 
     <th> 
      @Html.DropDownList("BuildID", (SelectList) ViewBag.Builds, "--Select One--", new {@onchange = "this.form.submit()"}) 
     </th> 
    </tr> 
</table> 

А на странице контроллера:

 [HttpPost] 
    public ActionResult FilterBenchmarks(FormCollection form) 
    { 
     var buildId = Convert.ToInt32(form["BuildID"]); 
     var benchmarks = db.Benchmarks.Where(b => b.BuildID == buildId).Include(b => b.Build).Include(b => b.Script); 

     var query = db.Builds.Select(c => new { c.Id, c.Version }); 
     ViewBag.Builds = new SelectList(query.AsEnumerable(), "Id", "Version"); 

     return View("Index", benchmarks.ToList()); 
    } 

Это сделало работу для меня, и теперь все работает нормально ! Я хочу поблагодарить людей, которые предложили различные решения, они заставили меня переосмыслить сценарий! Спасибо!

-1

С кодом, представленным, очень сложно воспроизвести точную проблему, с которой вы сталкиваетесь. Однако несколько простых шагов должны устранить проблему.

Во-первых, в Page_Load() вы используете bindData, чтобы связать выпадающее меню с данными. Тем не менее, список DropDown уже ссылки на него:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
      DataSourceID="SqlDataSource1" DataTextField="Version" 
      onselectedindexchanged="DropDownList1_SelectedIndexChanged" 
      DataValueField="Id"> 

Я хотел бы предложить удаление DataSource, DataValueField и т.д. атрибуты тега, так как они являются лишними.

Во-вторых, как уже упоминалось, вы выполняете привязку в Page_Load(). Некоторые процессы, в том числе установка текущего выбранного элемента, происходят между Page_Init() и Page_Load(), поэтому вы можете найти переключение вашего звонка на bindData() в Page_Init().

Наконец, ваши Page_Load() начинается с:

DropDownList1.SelectedIndexChanged += 
         new EventHandler(DropDownList1_SelectedIndexChanged); 

но ваш тег содержит атрибут onselectedindexchanged уже, так что вы, вероятно, будет в конечном итоге работает DropDownList_SelectedIndexChanged() дважды. Удалите один из них для большей эффективности.

+0

OP использует MVC и пытается использовать управление asp. – afzalulh

+0

Спасибо, что ответили на мою проблему быстро! очень признателен! Я попробовал все, что вы предложили, и до сих пор не повезло. Я понимаю, что трудно воспроизвести ситуацию. и вот почему я не могу решить проблему, я вообще не испытываю с asp.net, и я чувствую, что проблема не в моем коде, а где-то еще. Возможно, мои настройки или какая-то конфигурация. –

+0

@afzalulh Я понимаю, что да. Я просто не верю, что это его проблема - смешивание двух возможно. –

Смежные вопросы