Вы должны заключить это в оператор использования.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);
}