ASP.NET MVC2 - проверка IsPostBack при загрузке пользовательского элемента управления кажется неправильной? - PullRequest
1 голос
/ 23 июля 2010

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

<form id="CurrencyForm" method="post" runat="server">    
    Display prices in&nbsp;
    <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&nbsp;
    <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);
}

Ответы [ 5 ]

5 голосов
/ 23 июля 2010

MVC никогда не делает постбэков.Следовательно, IsPostBack всегда будет правильно ложным.То, что вы считаете обратной передачей, на самом деле является POST, потому что MVC не выполняет обратную передачу.Вам вообще не следует использовать серверные элементы управления ASP.NET в MVC.

1 голос
/ 23 июля 2010

1) потеря кода позади - в MVC «представления» (т.е. файлы .aspx или .ascx) не должны содержать никаких кодовых блоков, только разметку и короткие фрагменты кода для вызова свойств модели и т. Д.ваши атрибуты "runat = server" и добавьте атрибуты "name" ко всем элементам ввода, которые вы собираетесь отправить обратно на сервер.

2) установите атрибут "action" формы в URLна одном из ваших контроллеров, который будет обрабатывать сообщение

3), добавьте в свой контроллер действие, соответствующее указанному выше URL-адресу.В нем проверьте Request.Form ["currency"], чтобы увидеть, какое значение было выбрано, и установите переменную сеанса на основе этого.

4) из этого действия вы можете вернуть RedirectResult (? Имя может бытьнеправильно) указание исходного URL страницы;это скажет браузеру выполнить запрос «GET» для исходной страницы после публикации данных.(это известно как шаблон post, redirect, get , который MVC позволяет вам использовать, он может быть очень эффективным).

5) это само по себе не даст вамфункциональность «автоматическая публикация при изменении значения», которую вы использовали после автоответа, поэтому я бы добавил скрипт jQuery для отправки формы изменения значения в раскрывающемся списке.Что-то вроде


$("#currency").change(function(){ $("#CurrencyForm").submit(); });

(что потребует от вас добавить ссылку на скрипт в jQuery, если у вас его еще нет).

Надеюсь, это не слишком много работы!Поверь мне, попробуй, обними MVC, и ты никогда не оглянешься!

1 голос
/ 23 июля 2010

Я должен заметить, что этот сделал , используемый для работы в ASP.NET MVC 1. Но мы внесли изменение в ASP.NET MVC 2, которое мешает этому работать.

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

0 голосов
/ 23 июля 2010

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

0 голосов
/ 23 июля 2010

Ваш код проверяет Page.IsCallback, а не Page.IsPostback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...