Html.BeginForm в MVC3 рендерит слишком много - PullRequest
0 голосов
/ 31 мая 2011

У меня есть следующий код.Обратите внимание, что я не использую использование, поскольку хочу начать и завершить форму в двух разных областях моего кода.Кто-нибудь видел это действие, где помощник добавляет «System.Web.Mvc.Html.MvcForm».Я не могу понять, почему это добавлено.

Code:
 @Html.BeginForm(new { action = ViewContext.Controller.ValueProvider.GetValue("action").RawValue })

@{ Html.EndForm() }

Result:
<form action="/adminTests/Edit" method="post">System.Web.Mvc.Html.MvcForm

Когда я использую следующее, я не получаю "System.Web.Mvc.Html.MvcForm"

    @using (Html.BeginForm(new { action = ViewContext.Controller.ValueProvider.GetValue("action").RawValue }))
    {

}

Ответы [ 4 ]

3 голосов
/ 31 мая 2011

Вы должны заключить это в оператор использования.BeginForm пишет напрямую в поток ответов, он не предназначен для возврата строки, как другие помощники.То, как вы его используете, это записывает свои выходные данные, а затем возвращает объект MvcForm, который при удалении запишет закрывающий тег формы.Вместо этого ваш синтаксис вынуждает его вызывать ToString для возвращаемого объекта, что приводит к выводу, который вы видите.

@using(Html.BeginForm(...
{
   ...
}

Редактировать : поскольку вы не можете заключить его в оператор using, вынужно либо явно закрыть форму с помощью HTML, либо вызвать EndForm позже.В любом случае вы должны использовать BeginForm (и EndForm) в блоке кода вместо того, чтобы использовать его с синтаксисом вывода строки.Оба эти метода пишут непосредственно в поток ответов.

@{ Html.BeginForm() ..  }

</form>  or   @{ Html.EndForm() }

Вот соответствующие биты кода для тех, кто думает, что я неправ (без разрешения):

public static void EndForm(this HtmlHelper htmlHelper) {
    HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
    httpResponse.Write("</form>");  // <-- look ma, Response.Write()
}

private static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes) {
    TagBuilder tagBuilder = new TagBuilder("form");
    tagBuilder.MergeAttributes(htmlAttributes);
    // action is implicitly generated, so htmlAttributes take precedence.
    tagBuilder.MergeAttribute("action", formAction);
    // method is an explicit parameter, so it takes precedence over the htmlAttributes.
    tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);

    HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
    httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag)); <-- and here
    return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}
1 голос
/ 31 мая 2011

Помощники BeginForm/EndForm не возвращают IHtmlResult, поэтому вы должны использовать их следующим образом:

@{ Html.BeginForm(new { action = ViewContext.Controller.ValueProvider.GetValue("action").RawValue }); }

    ...

@{ Html.EndForm(); }
0 голосов
/ 22 февраля 2012

Я также видел System.Web.Mvc.Html.MvcForm при использовании:

Html.BeginForm("Index", "Home", FormMethod.Post)

Следующее изменение исправило это:

Html.BeginForm("Index", "Home", "POST");

Похоже, FormMethod.Post вызывает нежелательный вывод, но я не могуобъяснить это лучше, чем это.Изменения сработали для меня, хотя.

0 голосов
/ 31 мая 2011

Попробуйте что-то вроде этого:

    @using (Html.BeginForm()) { 
    @Html.ValidationSummary(true)
    <fieldset>
        <p>
            @Html.LabelFor(model => model.Username) <br />
            @Html.EditorFor(model => model.Username)
            @Html.ValidationMessageFor(model => model.Username)
        </p>

        <p>
            @Html.LabelFor(model => model.Password) <br />
            @Html.EditorFor(model => model.Password) @Html.RouteLink("Forgot Password", "password") <br />
            @Html.ValidationMessageFor(model => model.Password)
        </p>

        <p class="mtop10">              
            <div class="float-left small blue super-button">
                <a class="auto-submit" href="#">Login</a>
            </div>
            <div class="alt-action">
                or @Html.RouteLink("Register", "register")
            </div>
        </p>

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