2015-10-20 2 views
0

У меня есть пользователи, которые будут направлены в мое приложение с внешнего сайта, и во время этого перенаправления адреса электронной почты пользователя будут отправлены мне по HTTP POST.ASP.NET HTTP POST и перенаправление

То, что я пытаюсь выполнить, - это получить адрес электронной почты пользователя и отправить его пользователю в представление индекса.

У меня есть следующие методы:

[HttpGet] 
public ActionResult Index() 
    { 
     string email = ""; 

     string[] keys = Request.Form.AllKeys; 
     for (int i = 0; i < keys.Length; i++) 
     { 
      Response.Write(keys[i] + ": " + Request.Form[keys[i]] + "<br>"); 
      System.Diagnostics.Debug.WriteLine(keys[i] + ": " + Request.Form[keys[i]]); 

      email = Request.Form[keys[i]].ToString(); 
     } 

     return Index(email); 
    } 

[HttpPost] 
    public ActionResult Index(string email) 
    { 
     return View(); 
    } 

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

public ActionResult Httppost() 
    { 
     using (var wb = new WebClient()) 
     { 
      var data = new NameValueCollection(); 
      data["email"] = "[email protected]"; 

      var response = wb.UploadValues("http://localhost:57695/Home/Index", "POST", data); 
     } 

     return RedirectToAction("Index"); 
    } 

Проблема заключается в том, индекс никогда не получает адрес электронной почты из моего метода HttpPost(), и электронная почта всегда получали, как «». Как получить электронное письмо от Httppost() в Index()?

ответ

0

Почему вы отправляете адрес электронной почты в поле «» отдельного запроса? Эти два запроса не имеют ничего общего друг с другом. Данные, полученные в одном, недоступны для другого, и они не гарантируются в том же порядке.

Вместо этого:

var response = wb.UploadValues("http://localhost:57695/Home/Index", "POST", data); 
return RedirectToAction("Index"); 

Просто отправьте значение в один запроса так, что он будет доступен в этом запросе:

return RedirectToAction("Index", new { email = "[email protected]" }); 

Тогда вам нужно только один действия:

[HttpGet] 
public ActionResult Index(string email) 
{ 
    // use the email parameter 
} 

Side Примечание: Я не думаю, что это будет делать то, что вы ожидаете:

return Index(email); 

Это будет выглядеть для зрения имени значения переменной email. Из-за того, как работает перегрузка методов, вы не можете использовать string сам по себе в качестве модели. Вы захотите либо установить его на фактическую модель, либо вместо этого поставить вместо него ViewBag.

+0

Благодарим вас за разъяснение. Теперь я понимаю. Тем не менее, решение, которое вы предоставили, привело меня к тому, что строка URL была следующей: http: // localhost: 57695 /? Email = test% 40email.com. Мне нужно избегать пользователей, манипулирующих электронной почтой через строку запроса. Это можно сделать? – dexter

+0

На самом деле, мне нужно отправить электронное сообщение как HTTP-сообщение, а не через вызов метода. Итак, верните RedirectToAction («Индекс», новый {email = "[email protected]"}); не выполняет требования, которые я считаю. – dexter

+0

@ UğurDinç: Сообщение должно поступать от клиента, а не от сервера. Вам понадобится форма в представлении, в которой сообщения отображаются на целевой URL, а не на перенаправление. Также обратите внимание, что пользователи могут манипулировать почтовыми данными почти так же легко, как данные строки запроса. Если вам нужно, чтобы данные были «безопасными» в некотором роде, вам нужно сохранить его на стороне сервера, возможно, в сеансе или что-то в этом роде. – David