MVC Form Submit - перенаправление на действие, которое не доступно напрямую из браузера. - PullRequest
2 голосов
/ 02 февраля 2012

Я изучаю MVC 3 в нерабочее время прямо сейчас, и прошлой ночью я столкнулся с проблемой, которая кажется очень простой, но не могу найти решение для нее.

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

Контроллер настроен так.

public ActionResult ContactUs()
{
   return View();
}

[HttpPost]
public ActionResult ContactUs(ContactInfo contactInfo)
{
     if (!ModelState.IsValid)
     {
          return View();
     }

     //perform some business logic

     return RedirectToAction("InquirySubmitted",contactInfo);


}

 public ActionResult InquirySubmitted(ContactInfo contactInfo)
 {
    return View(contactInfo);
 }

Проблема: Я не хочу, чтобы конечные пользователи переходили непосредственно к действию InquirySubmitted через браузер.
Я только хочу, чтобы действие ContactUs в контроллере могло отправлять пользователей в представление InquirySubmitted.

Я попытался сделать действие InquirySubmitted частным, чтобы его мог вызывать только контроллер:

private ActionResult InquirySubmitted(ContactInfo contactInfo)

Но это приводит к ошибке, которую я полностью понимаю, потому что заставляю браузер запрашивать отправку InquirySubmitted с помощью RedirectToAction ().

Так что мой вопрос прост: каково лучшее решение в стиле «MVC 3» для этой проблемы.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Во-первых, я должен сказать ... Кому интересно, если кто-то сможет перейти непосредственно на страницу отправленного запроса? Есть ли какая-либо конфиденциальная информация или что-то чувствительное? Если нет, ну и что? Что это больно?

Однако, если вы полны решимости сделать это. Ответ на ваш вопрос «Как сделать действие недоступным непосредственно из браузера» заключается в том, что вы можете просто использовать Html.Action() для рендеринга страницы, а затем украсить метод действия атрибутом [ChildActionOnly].

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

2 голосов
/ 02 февраля 2012

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

Вы уже передаете метод InquirySubmitted вашей модели (ContactInfo).Не могли бы вы просто проверить данные, переданные методу, и, если они отсутствуют, перенаправить пользователя на страницу ошибки (или другую страницу по вашему выбору)?

Альтернативным решением было бы установить логическое значение в сеансеэто означает, что пользователь заполнил форму «ContactUs».Затем вы можете проверить этот объект сеанса в InquirySubmitted.

0 голосов
/ 02 февраля 2012

Не уверен, применимо ли это в MVC3, но в MVC2 это сработало.

В вашем файле global.asax есть структура URL.Вы можете добавить свой запрос в список адресов, которые там недоступны.

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