У меня есть пользовательский элемент управления, который содержит следующий код:
<form id="CurrencyForm" method="post" runat="server">
Display prices in
<asp:DropDownList ID="currency" runat="server" AutoPostBack="true">
<asp:ListItem Value="GBP">GBP (£)</asp:ListItem>
<asp:ListItem Value="USD">USD ($)</asp:ListItem>
<asp:ListItem Value="EUR">EUR (€)</asp:ListItem>
</asp:DropDownList>
</form>
Этот пользовательский элемент управления включен в мою главную страницу, поэтому он доступен на каждой странице сайта.
Вот код:
protected void page_load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
currency.SelectedValue = (string)Session["currency"];
}
else
{
session["currency"] = currency.SelectedValue;
Response.Redirect(Request.RawUrl);
}
}
Когда я изменяю выбор выпадающего списка, запускается обратная передача. Однако значение IsPostBack
, похоже, всегда ложно. Я не могу понять, что я делаю здесь неправильно?
Решение
Посмотрев на советы из большинства постов, я понял, что ошибался, используя код code_behind и т. Д. Вместо контроллеров. Я понял, как использовать действие, чтобы в основном перенаправить обратно на ту же страницу, так что теперь у меня есть следующее:
Пользовательский контроль:
<% using (Html.BeginForm("ChangeCurrency", "Home", FormMethod.Post)) {%>
Display prices in
<select id="currency" name="currency">
<option value="GBP">GBP (£)</option>
<option value="USD">USD ($)</option>
<option value="GBP">EUR (€)</option>
</select>
<input type="submit" value="change" /> // this is temporary to test the submit
<%} %>
Действие
public ActionResult ChangeCurrency(string currency)
{
Session["currency"] = currency;
return new RedirectResult(Request.UrlReferrer.AbsoluteUri);
}