2016-04-05 4 views
0

У меня есть ContactForm, который появляется на двух страницах, когда форма передается действие FormSubmit происходит, которая выглядит следующим образом:MVC 5 Форма, как я могу вернуть страницу, на которой я нахожусь, когда действие formubmit завершено?

public async System.Threading.Tasks.Task<ActionResult> FormSubmit(contactform model) 
{ 
    var current = Request.Url.OriginalString; 
    var response = Request["g-recaptcha-response"]; 
    string secretKey = "keygoeshere"; 
    var client = new WebClient(); 
    var result = client.DownloadString(string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", secretKey, response)); 
    var obj = JObject.Parse(result); 
    var status = (bool)obj.SelectToken("success"); 
    ViewBag.Message = status ? "Google reCaptcha validation success" : "Please click on the recaptcha"; 

    if (ModelState.IsValid && status) 

    { 
     try 
     { 

      var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>"; 
      var message = new System.Net.Mail.MailMessage(); 
      message.To.Add(new MailAddress("emailaddresshere")); 
      message.Subject = "Contact Us"; 
      message.Body = string.Format(body, model.FirstName, model.LastName, model.number); 
      message.IsBodyHtml = true; 
      using (var smtp = new SmtpClient()) 
      { 
       await smtp.SendMailAsync(message); 
       return RedirectToAction("Sent"); 
      } 
     } 
     catch (Exception) 
     { 
      return View("Error"); 
     } 
    } 

    else 
    { 
     return View("What goes here?"); 

    } 

Форма проверяет ReCaptcha, а затем проверяет поля с использованием модели «ContactForm» , Если recaptcha не заполняется или проверка не выполняется, в результате в данный момент возвращается «Return View();», который попытается вернуть действие «Formsubmit», которое ничего не возвращает, потому что это не представление.

Так я все равно понимаю. То, что я хотел бы сделать, - это действие, описанное выше, чтобы знать, на какой странице будет отправляться форма, и вернуть представление этой конкретной страницы. Я могу разместить отдельную страницу и вернуться туда, но тогда это означает, что мне нужны два отдельных действия «formubmit» или понравившиеся, по одному для каждой страницы. Есть ли способ вернуть представление на страницу, на которую отправляется форма?

Кроме того, пока я здесь, я хотел бы спросить, знает ли кто-нибудь, как я могу поддерживать ту же позицию на странице, когда я возвращаю это представление, и проверка не сработала?

ответ

1

Не совсем понятно, что вы делаете, но если я должен был догадаться, наиболее логично то, что у вас есть контактная форма в фактическом макете, поэтому она находится на каждой странице, но у вас есть только одно действие для обработки после.

Если это так, то лучше всего сделать, это включить скрытое поле в форме с обратной URL:

@Html.Hidden("returnUrl", Request.RawUrl) 

Это будет всегда заполнено с текущей URL. Затем в своем post action вы можете использовать это, чтобы отправить пользователя обратно туда, где они были, когда они отправили форму.

public async Task<ActionResult> FormSubmit(contactform model, string returnUrl) 
{ 
    ... 

    if (!String.IsNullOrWhiteSpace(returnUrl) && Url.IsLocalUrl(returnUrl)) 
    { 
     return Redirect(returnUrl); 
    } 
    return RedirectToAction("Fallback"); 
} 

Проблема вы будете иметь с этим, когда есть ошибка в форме, например, капча является недействительным. Невозможно перенаправить назад и сохранить состояние формы, и вы не можете просто вернуть представление с этой исходной страницы из этого действия. Предположительно, разные страницы будут использовать разные модели, нуждаются в различной инициализации и т. Д. Просто невозможно компенсировать все потенциальные различия в действии.

Одним из вариантов является фактическое представление для этой формы. Затем, при ошибке, вы возвращаете стандартный вид контакта. Это означает, что форма будет перерисовываться как собственная, а не как часть вашего макета, но затем сохраняется состояние модели, и пользователь может исправить любые ошибки и продолжить. Включив скрытое поле URL-адреса возврата (которое теперь нужно будет установить на основе того, что было передано действию, а не Request.RawUrl), вы можете перенаправить пользователя обратно на исходную страницу после того, как они, наконец, сделают успешную запись.

Честно говоря, если вы хотите иметь форму как часть своего макета, и вы хотите, чтобы пользователь находился на одной странице, лучше всего отправить его через AJAX.

+0

Здравствуйте, спасибо за помощь, я попробовал ваше решение, и, поскольку он стоит, он просто возвращает меня на страницу «резервной», которую я установил. Я добавил скрытую часть @html в вершине самой формы контакта, которая отображается на двух страницах. Затем я добавил параметр 'string returnURL' в formubmit и оператор if, где раньше возвращался вид View(). Кажется, он не возвращает меня на ту же страницу? – Rob

+0

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

0

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

Пожалуйста, пытаясь угадать>@using (Html.BeginForm("action", "controller", new { ReturnUrl = ViewBag.ReturnUrl })) {... на ваш взгляд

и

FormSubmit(contactform model, string returnUrl){your code; return Redirect(returnUrl);} 

вы можете найти реализацию в AccountController, который создается по умолчанию в шаблоне MVC.

+0

Здравствуйте, я пробовал ваше решение, но получаю сообщение об ошибке, указывающее, что «returnURL» не может быть пустым. Я изменил свой код точно так же, как вы указали выше. Я что-то пропустил? Спасибо – Rob

+0

Здравствуйте, Роб, пожалуйста, скачайте образец отсюда -> https://drive.google.com/open?id=0B-jg0j7M5PfERS1NZXJybVlWQkk Я внедрил его в необработанном виде. возможно, вы можете сделать это лучше меня :) – Shekhar

+0

Было бы лучше, если вы используете ajax для этого. – Shekhar

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