Ответ 1
Вы можете использовать
<form action =" <%= Url.Action(
"action",
"controller",
ViewContext.RouteData.Values,
"https"
) %>" method="post" >
Я столкнулся с проблемой с тем, что должно быть простой формой входа в ASP.NET MVC 2. По существу моя форма выглядит примерно так:
using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm" }))
У меня есть фильтр RequiresHTTPS в методе действия LogOn, но когда он выполняется, я получаю следующее сообщение
Запрошенный ресурс может быть доступ через SSL
В этот момент единственным решением, которое работало, было передать дополнительный атрибут html action следующим образом:
var actionURL = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm", @action = actionURL }))
В то время как это работает, я задаюсь вопросом: а) почему я вижу эту проблему в первую очередь и б) если есть более простой способ публикации на https с http-страницы?
[изменить]
Я должен был указать, что выпадающий список входа будет доступен на многих общедоступных страницах. Я не хочу, чтобы все мои страницы были HTTPS. Например, моя страница надежды, которую ANYONE может видеть, не должна основываться на HTTPS. По сути, мне нужно указать протокол в моей форме, но не знаю, как это сделать или если это возможно.
Буду признателен за любые советы/предложения. Спасибо заранее
В JP
Вы можете использовать
<form action =" <%= Url.Action(
"action",
"controller",
ViewContext.RouteData.Values,
"https"
) %>" method="post" >
Используйте атрибут [RequireHttps]
как для действия, которое отображает форму, так и для той, которую вы отправляете.
Обновление. Просмотрите комментарии ниже об уязвимостях безопасности этого подхода, прежде чем рассматривать использование этого кода.
Я обнаружил, что работает гибрид примеров кода JP и Malcolm.
using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @action = Url.Action("Login","Account",ViewContext.RouteData.Values,"https") }))
Все еще чувствовал себя немного взломанным, хотя я создал специальный помощник BeginForm. Пользовательский помощник чист и не требует https при работе локально.
public static MvcForm BeginFormHttps(this HtmlHelper htmlHelper, string actionName, string controllerName)
{
TagBuilder form = new TagBuilder("form");
UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
//convert to https when deployed
string protocol = htmlHelper.ViewContext.HttpContext.Request.IsLocal == true? "http" : "https";
string formAction = Url.Action(actionName,controllerName,htmlHelper.ViewContext.RouteData.Values,protocol);
form.MergeAttribute("action", formAction);
FormMethod method = FormMethod.Post;
form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag));
MvcForm mvcForm = new MvcForm(htmlHelper.ViewContext);
return mvcForm;
}
Пример использования:
@using (Html.BeginFormHttps("Login", "Account"))