2012-04-18 3 views
1

Я переписывание приложений ASP.NET и заметил разницу в поведении ...Запрос паров без вести POST

В моем случае Page_Load У меня есть некоторый код, такие как:

string id = Request["id"] 

который получает URL-адрес id из URL-адреса. При загрузке страницы (например, HTTP GET) это работает как ожидалось в обеих версиях. У меня также есть кнопка onclick обработчик событий. Очевидно, что он выполняет POST на сервере, а также вызывает обработчик Page_Load. Разница в том, что в исходной версии приложения идентификатор успешно загружен из запроса. В новой версии приложения id возвращается как null. Я обнаружил, что мне нужно использовать Request.Params ["id"], но я совершенно озадачен тем, почему Request ["id"] работает для запросов POST в одном приложении, но не в другом.

Единственная разница между приложениями в том, что первая была создана как «Файл» -> «Новый сайт», а второй «Файл» -> «Новое веб-приложение». Я думаю, что это то, что вызывает разницу в поведении, но я задаюсь вопросом, почему это тонкое различие, а также если есть что-то еще, о чем я должен знать между 2.

Любые советы, которые очень ценятся.

+0

Хорошо, у меня есть еще кое-какую информацию. Я заметил, что на самом деле Request ['id'] возвращает параметр дважды. Вот почему ... Я использую HttpModule для выполнения перенаправления URL-адресов.Часть этого кода делает следующее: 'если (context.Request.QueryString.Count> 0) { если (sendToUrl.IndexOf() = -1 '?!) sendToUrl + = "&" + контекст .Request.QueryString.ToString(); еще sendToUrl + = "?" + context.Request.QueryString.ToString(); } ' –

+0

[продолжение] Это добавление URL Парама дважды. Это не происходило в оригинальной версии приложения. Я могу исправить это, проверив Request.RequestType. Но остается вопрос - почему разница в поведении ?! –

ответ

0

Как уже упоминалось, у вас есть параметр идентификатор, проходящий через два раза. Это будет связано с тем, что у вас есть один в параметрах строки запроса и один в параметрах формы. Я не уверен, почему это происходит в одном веб-приложении, а не в другом, но вы можете внести изменения в свой код, чтобы более точно учитывать его.

Если вы просматриваете источник HTML в своем браузере, вы увидите, что значение action для формы будет текущим URL-адресом страницы, включая строку запроса. Вот почему отправляется первый идентификатор. Очевидно, что второй идентификатор приходит через с помощью самой формы:

HTML Источник основного веб-формы

<form method="post" action="Default.aspx?id=3" id="ctl01"> 
    <input type="text" name="id"> 
</div> 

Есть несколько вещей, которые вы можете сделать здесь:

  1. первый off, я бы не использовал Request.Params ["id"] для этого, поскольку он объединяет строку запроса, форму, файлы cookie и переменные сервера в одну коллекцию. Вы должны использовать Request.Querystring и Request.Form свойства, основанные на том, что вам нужно, и когда
  2. В вашем обработчике Page_Load используйте свойство Page.IsPostBack, чтобы определить, загружается ли страница для GET или POST, и использовать свойства запроса, описанные выше.

Пример использования Page.IsPostBack:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string id = string.Empty; 
    if (Page.IsPostBack) 
    { 
     id = Request.Form["id"]; 
    } 
    else 
    { 
     id = Request.QueryString["id"]; 
    } 
} 
+0

Да, все сделано. Как я уже сказал в своем комментарии выше, я нацелил ошибку на код перенаправления url. Кажется, есть тонкие различия в том, как обрабатываются запросы POST. Например, в контексте сайта. Request.QueryString.Count == 0, но в контексте веб-приложения. Request.QueryString.Count> 0. –

0

Я всегда использую проект веб-приложений, но разница заключается в компиляции. Веб-сайт имеет динамическую компиляцию, а это означает, что первый запрос будет медленнее, а веб-приложение имеет предварительно скомпилированные DLL-версии.

Проверить это для профи и против: http://maordavid.blogspot.ca/2007/06/aspnet-20-web-site-vs-web-application.html

+0

Спасибо за ответ. Я не понимаю, как компиляция должна иметь значение для того, как работают параметры запроса, но угадайте, что должны быть другие тонкости. –

Смежные вопросы