ASP.NET MVC - отправить форму в HTML-закладки? - PullRequest
4 голосов
/ 09 декабря 2010

При использовании такой формы:

<h2>
<%:Model.EulaTitle %>
</h2>
<p>
<%=Model.EulaHtml %>
</p>
<a name="errors"></a>
<%:Html.ValidationSummary()%>


<div style="text-align:center;">
<% using (Html.BeginForm())
   { %>

<%:Html.HiddenFor(model => model.SourceUrl)%>
<%:Html.HiddenFor(model => model.EulaId)%>


<a name="accept"></a>
<div style="text-align:center;">
<%:Html.CheckBoxFor(model => model.Accepted)%>
<%:Html.LabelFor(model => model.Accepted)%>
</div>
<input type="submit" value="Submit">
<% } %>
</div>

Мне нужно, чтобы страница прокручивалась до #errors при публикации. Model.EulaHtml содержит текст EULA некоторой длины, и я бы предпочел, чтобы пользователям не приходилось вручную прокручивать страницу вниз, чтобы увидеть сообщение об ошибке, если они публикуют страницу без принятия соглашения.

Если контроллер обнаруживает ModelState.IsValid на Post, он перенаправляет на другую страницу. Если нет, мне нужно остаться на этой странице, но выделите тег привязки закладки #errors.

Я думал только о добавлении «#errors» в конец URL-адреса в действии формы, но я получаю ошибки по линии a potentially dangerous .... ('%'). Возможно, я неправильно кодирую метку хеша. Кто-нибудь еще должен был иметь дело с этим? Мы имеем дело с довольно жесткими требованиями к совместимости браузера (IE6 + и все остальное под солнцем), поэтому я стараюсь по возможности избегать использования JavaScript.

Обновление

Я получаю ошибку:

A potentially dangerous Request.Path value was detected from the client (%).

Я изменил Html.BeginForm() вызов

<% using (Html.BeginForm(new { @action="#errors" }))
   { %>

И полученный URL-адрес:

http://..../TheControllerName/Eula/%2523errors/

Я также заметил, что несколько параметров queryString, которые были переданы, исчезают, когда я таким образом устанавливаю атрибут action. (Не удивительно, но для меня это не очевидно сразу)

Ответы [ 3 ]

6 голосов
/ 09 декабря 2010

Попробуй так:

<form action="<%: Url.Action("actionName", "controllerName") %>#errors" method="post">

    <%:Html.HiddenFor(model => model.SourceUrl)%>
    <%:Html.HiddenFor(model => model.EulaId)%>


    <a name="accept"></a>
    <div style="text-align:center;">
    <%:Html.CheckBoxFor(model => model.Accepted)%>
    <%:Html.LabelFor(model => model.Accepted)%>
    </div>
    <input type="submit" value="Submit">

</form>

Вы также можете написать собственный помощник HTML, который будет выполнять эту работу:

public static class FormExtensions
{
    public static MvcForm MyBeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, string fragment)
    {
        var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, fragment, null, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true);
        var builder = new TagBuilder("form");
        builder.MergeAttribute("action", formAction);
        builder.MergeAttribute("method", "post", true);
        htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
        return new MvcForm(htmlHelper.ViewContext);
    }
}

А потом:

<% using (Html.MyBeginForm("index", "home", "errors")) { %>
    ...
<% }
5 голосов
/ 12 октября 2013

Обновлено решение проблемы MVC 4:

 @using (Html.BeginForm(null, null, null, FormMethod.Post,
     new
        {
            @action = Url.Action("MyAction") + "#bookmark",
            @class = "form-class",
            target = "_blank"
        }))
 {
     ... 
     <input type="submit" value="submit" />

 }

Html.BeginForm будет генерировать атрибуты проверки в вашей форме, использование тега html <form> не будет.

Этот вызов использует перегрузку Html.BeginForm(actionName, controllerName, routeValues, FormMethod, htmlAttributes), обнуляя всю маршрутизацию и назначая действие как атрибут html. Маршрутизация осуществляется с помощью Url.Action (), к которому я добавляю свою закладку.

1 голос
/ 19 января 2012

Я придумал решение, немного отличающееся от этого, используя фильтр действий:

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

Он изменяет буфер HTML и выводит небольшой фрагмент JavaScript, чтобы дать браузеру команду добавить закладку.

Надеюсь, это поможет:)

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