проблема аргумента команды веб-форм asp.net

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

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

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

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

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


person AndreasN    schedule 02.04.2009    source источник


Ответы (3)


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

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

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

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

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

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

person Bryan    schedule 05.04.2009

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

<%# r.ResultId %>
person Steve    schedule 02.04.2009

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

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);

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

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

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

person The real napster    schedule 02.04.2009