Если вы просто создаете список переключателей для ответов, вы можете использовать RadioButtonList
элемент управления. Это создаст правильный HTML-код, чтобы можно было выбрать только один ответ на вопрос без необходимости обратной отправки, чтобы отменить выбор других вариантов.
Если ваш шаблон ответа содержит более одного RadioButton
, все становится сложнее. Когда он не размещен в RadioButtonList
, RadioButton
использует UniqueID
родительского NamingContainer
для создания своего уникального имени группы. К сожалению, в вашем примере NamingContainer
будет ListViewDataItem
из списка lvwAnswers, и у каждого ответа будет свой ID.
Что вам нужно, так это RadioButton
, который будет смотреть на NamingContainer
NamingContainer
, чтобы сгенерировать имя своей группы. Вы можете либо повторно реализовать элемент управления RadioButton
, либо использовать немного отражения для обновления закрытого поля _uniqueGroupName
:
[ToolboxData("<{0}:ListRadioButton runat=\"server\" />")]
public class ListRadioButton : RadioButton
{
private static readonly FieldInfo UniqueGroupNameField = FindUniqueGroupNameField();
private string _uniqueGroupName;
private static FieldInfo FindUniqueGroupNameField()
{
return typeof(RadioButton).GetField("_uniqueGroupName",
BindingFlags.NonPublic | BindingFlags.Instance);
}
protected virtual string CreateUniqueGroupName()
{
string result = GroupName;
if (string.IsNullOrEmpty(result))
{
result = ID;
}
if (string.IsNullOrEmpty(result))
{
result = UniqueID;
}
else
{
Control container = NamingContainer;
if (container != null)
{
if (container is IDataItemContainer)
{
container = container.NamingContainer ?? container;
}
result = container.UniqueID + base.IdSeparator + result;
}
else
{
string uniqueID = UniqueID;
if (!string.IsNullOrEmpty(uniqueID))
{
int index = uniqueID.LastIndexOf(base.IdSeparator);
if (index != -1)
{
result = uniqueID.Substring(0, 1 + index) + result;
}
}
}
}
return result;
}
private void EnsureUniqueGroupName()
{
if (_uniqueGroupName == null)
{
string value = CreateUniqueGroupName();
if (UniqueGroupNameField != null) UniqueGroupNameField.SetValue(this, value);
_uniqueGroupName = value;
value = base.Attributes["value"];
if (string.IsNullOrEmpty(value))
{
base.Attributes["value"] = UniqueID;
}
}
}
protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
EnsureUniqueGroupName();
return base.LoadPostData(postDataKey, postCollection);
}
protected override void Render(HtmlTextWriter writer)
{
EnsureUniqueGroupName();
base.Render(writer);
}
}
Имея этот элемент управления и зарегистрированный с использованием префикса site
, вы можете изменить свой код на:
<asp:ListView ID="lvwRiskQuestions" runat="server" ItemPlaceholderID="QuestionItemPlaceholder">
<LayoutTemplate>
<asp:PlaceHolder ID="QuestionItemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<%# Eval("DESCRIPTION") %>
<asp:ListView ID="lvwAnswers" runat="server" ItemPlaceholderID="AnswerItemPlaceholder" DataSource='<%# Eval("Answers")%>'>
<LayoutTemplate>
<asp:PlaceHolder ID="AnswerItemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<site:ListRadioButton ID="rdbSelect" runat="server"
Text='<%# Eval("Description") %>'
/>
</ItemTemplate>
</asp:ListView>
</ItemTemplate>
</asp:ListView>
В отрендеренном HTML переключатели для каждого вопроса будут иметь одинаковые name
, и вы сможете выбрать только один ответ на вопрос, без необходимости публиковать всю страницу для каждого выбора.
person
Richard Deeming
schedule
07.11.2012