Проблема с командным аргументом web-форм asp.net - PullRequest
0 голосов
/ 02 апреля 2009

У меня проблема с управлением кнопками в веб-формах 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 ()%>». Так что этот код не выполняется. Есть ли хороший способ заполнить управляющие свойства таким образом?

Ответы [ 3 ]

0 голосов
/ 02 апреля 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);

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

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

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

0 голосов
/ 05 апреля 2009

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

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

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

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

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

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

0 голосов
/ 02 апреля 2009

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

<%# r.ResultId %>
...