// 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);
}
}
}
}
}
}