2009-04-02 2 views
0

У меня проблема с кнопкой управления в веб-формах asp.net.asp.net проблема сардакардин веб-форм

После использования mvc немного я начал использовать foreach в aspx-файлах в webforms тоже, вместо повторителей, в основном причиной всего мусорного представления, созданного ретранслятором.

Он отлично работает, когда вы просто перебираете элементы управления html. Но мне нелегко было управлять кнопками.

<% foreach (var r in Reports) { %> 
    <asp:LinkButton OnClick="Click_DeleteResult" CommandArgument='<%= r.ResultId.ToString() %>' runat="server">Delete</asp:LinkButton> 
<% } %> 

На постбэка CommandArgument на этой кнопке становится "<% = r.ResultId.ToString()%>". Так что код не выполняется. Есть ли хороший способ заполнить свойства управления таким образом?

ответ

0

Это некрасиво. Преимущество # 1 использования ASP.NET (особенно MVC) - это разделение логики и презентации. Я сжимаю каждый раз, когда мне приходится искать в aspx-файле для выполнения кода.

Если вам не нравится «мусор» ViewState, тогда просто отключите его для этого элемента управления!

<asp:Repeater ID="MyRepeater" runat="server" EnableViewState="false"> 

Если вы настаиваете на этом, хотя ... Я видел такие ситуации, когда ASP.NET не разобрать тег сервера правильно, если я не упал на окружающие кавычки. Вроде так:

CommandArgument=<%= r.ResultId.ToString() %> 

Возможно, не полностью соответствует HTML, но ASP.NET не заботит. Если вам действительно нужно вывести эти окружные кавычки, по какой-то причине вы можете поместить их внутри тега сервера вместо внешнего. Это противоречит интуиции, но иногда вам приходится так поступать.

0

Вы пробовали выражение DataBinding

<%# r.ResultId %> 
-1

Как о добавлении его с помощью кода позади, это быстрый и грязный пример, но я думаю, вы получите идею:

HtmlTable table = new HtmlTable(); 
foreach (var r in Reports) 
{ 
    LinkButton lnkbtn = new LinkButton(); 
    lnkbtn.CommandArgument = r.ResultId; 
    lnkbtn.Click += Click_DeleteResult; 
    HtmlTableRow tr = new HtmlTableRow(); 
    HtmlTableCell tc_resultID = new HtmlTableCell(); 
    tc_caseNo.Controls.Add(lnkbtn); 
    tr.Cells.Add(tc_resultID); 
    table.Rows.Add(tr); 
} 
div_yourContainerDiv.Controls.Add(table); 

я иногда предпочитаю это решение .. зависит от назначения .. Однако, вероятно, есть решение для вашей текущей проблемы, которая не требует, чтобы вы взяли ее для кодирования позади :)

Если вы много работаете с общим контентом это может быть довольно хороший способ сделать это без какого-либо мусорного кода viewstate, который все испортит для SE.

Вы можете сделать что-то, что я сделал с успехом, с некоторыми важными проектами для SEO. Вы можете взять и сохранить viewstate в качестве сеанса и вместо этого создать ключ сеанса в viewstate. Таким образом вы позволяете серверу обрабатывать viewstate, а не клиент. Он создает дополнительную нагрузку на сервер, но всегда будут компромиссы.

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