2016-11-10 1 views
0

У меня есть ретранслятор метода оплаты, содержащий кнопку. У нас есть новые стили кнопок, которые необходимо применять. Новый стиль кнопки изменяется на основе параметра btnMode в базе данных, который установлен в строку, представляющую селектор классов CSS. CSS работает отлично.ASP.NET Передача asp: значение повторителя для asp: атрибут CssClass Button

Я положил это на странице ASPX:

<asp:Button ID="btnEdit" 
      runat="server" 
      ClientIDMode="Static" 
      CssClass='<%# Eval("btnMode") %>' 
      Text="edit" 
      CommandName="ChangePaymentProfile" 
      CommandArgument='<%# Eval("PaymentSourceId") + "|" + Eval("AuthNetPaymentProfileId")%>' /> 

В ASPX.cs

//Command Button Clicked: Change Payment Method 
    else if (e.CommandName.ToLower().Equals("changepaymentprofile")) 
    { 
     hdChangeYN.Value = "Y"; 

     showAddPaymentForm(); 

     //display billing address of selected card 
     hsParams.Add("CustomerId", User.Identity.Name); 
     hsParams.Add("PaymentSourceId", strPaymentSourceId); 
     DataTable dt = DbHelper.GetDataTableSp("234_accountAddress__ByPaySourceId", hsParams); 

     if (dt.Rows.Count > 0) 
     { 
      tbFistName.Text = dt.Rows[0]["FirstName"].ToObjectString(); 
      tbLastName.Text = dt.Rows[0]["LastName"].ToObjectString(); 
      inputAddress1.Text = dt.Rows[0]["Address"].ToObjectString(); 
      inputAddress2.Text = ""; 

      string strCountryCd = dt.Rows[0]["CountryCd"].ToObjectString(); 
      ddlCountry_Update(strCountryCd); //Update Country & State DDL because Country can be a foreign country 

      ddlCountry.SelectedValue = strCountryCd; 
      inputCity.Text = dt.Rows[0]["City"].ToObjectString(); 
      ddlState.SelectedValue = dt.Rows[0]["StateProvinceId"].ToObjectString(); 
      inputZipcode.Text = dt.Rows[0]["Zipcode"].ToObjectString(); 

      ddlCardType.SelectedValue = dt.Rows[0]["CardType"].ToObjectString(); 
     } 
    } 

Когда я загрузить страницу в браузере <%# Eval("btnMode") %> не разрешится до значения. Я вижу это, когда я открываю инспектор:

<input 
    id="btnEdit" 
    class="<%# Eval("btnMode") %>" 
    type="submit" 
    name="ctl00$ctl00$ContentPlaceHolderFront$ContentPlaceHolderFront$rptList$ctl01$btnPrimary" 
    value="" 
    onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$ContentPlaceHolderFront$ContentPlaceHolderFront$rptList$ctl01$btnPrimary&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" > 

Важно отметить, что этот атрибут CommandArgument='<%# Eval("PaymentSourceId") %>' делает работу, и btnMode действительно содержит достоверные данные.

+0

Пожалуйста, покажите ваш 'btnPrimary' метод связывания на коде позади, вероятно, у вас есть данные связывания вопрос в уровне кода, который влияет на страницу жизненного цикла. –

+0

Вы показываете две разные кнопки. Aspx of 'btnEdit' и выведенный html' btnPrimary'. Что он? – VDWWD

+0

'btnEdit'. На самом деле у меня есть три кнопки, которые нужно настроить таким образом. Вопрос исправлен. –

ответ

1

Как я писал в комментарии, не все свойства в элементах управления Asp.Net могут быть привязаны к базе данных. CssClass - это тот, который не может быть привязан к базе данных.

Чтобы обойти это, вы можете добавить обработчик событий OnItemDataBound к ретранслятору, где находится Button. Затем в обработчике событий вы можете указать e.Item.DataItem, чтобы получить нужное значение, и установите его как CssClass на кнопку. Пример кода:

<asp:Repeater ID="RepeaterTest" runat="server" OnItemDataBound="RepeaterTest_ItemDataBound"> 
    <ItemTemplate> 
     <div> 
      <asp:Button ID="TestButton" runat="server" Text='<%# Eval("someText") %>'/> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 

и код позади:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var testData = Enumerable.Range(1, 10).Select(i => new { someText = "Button " + i.ToString() }).ToList(); 
    RepeaterTest.DataSource = testData; 
    RepeaterTest.DataBind(); 
} 
protected void RepeaterTest_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    dynamic foo = e.Item.DataItem; 
    ((Button)e.Item.FindControl("TestButton")).CssClass = foo.someText; 
} 
+0

Это помогло мне, но 'e.Item.DataItem.IsPrimaryDisplay' не работал для меня. Скорее, 'DataBinder.Eval (e.Item.DataItem,« IsPrimaryDisplay »). ToString()'. т. е. этот метод http://stackoverflow.com/a/1471443/1783439 –

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

  • Нет связанных вопросов^_^