// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Text.Encodings.Web; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Mvc.Rendering { /// /// An HTML form element in an MVC view. /// public class MvcForm : IDisposable { private readonly ViewContext _viewContext; private bool _disposed; /// /// Initializes a new instance of . /// /// The . public MvcForm(ViewContext viewContext) { if (viewContext == null) { throw new ArgumentNullException(nameof(viewContext)); } _viewContext = viewContext; } /// public void Dispose() { if (!_disposed) { _disposed = true; GenerateEndForm(); } } /// /// Renders the </form> end tag to the response. /// public void EndForm() { Dispose(); } /// /// Renders and /// the </form>. /// protected virtual void GenerateEndForm() { RenderEndOfFormContent(); _viewContext.Writer.Write(""); _viewContext.FormContext = new FormContext(); } private void RenderEndOfFormContent() { var formContext = _viewContext.FormContext; if (formContext.HasEndOfFormContent) { var writer = _viewContext.Writer; var htmlWriter = writer as HtmlTextWriter; HtmlEncoder htmlEncoder = null; if (htmlWriter == null) { htmlEncoder = _viewContext.HttpContext.RequestServices.GetRequiredService(); } foreach (var content in formContext.EndOfFormContent) { if (htmlWriter == null) { content.WriteTo(writer, htmlEncoder); } else { htmlWriter.Write(content); } } } } } }