// 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.Security.Principal;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewComponents;
using Microsoft.AspNet.Mvc.ViewEngines;
using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.AspNet.Routing;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
namespace Microsoft.AspNet.Mvc
{
///
/// A base class for view components.
///
[ViewComponent]
public abstract class ViewComponent
{
private IUrlHelper _url;
private dynamic _viewBag;
private ViewComponentContext _viewComponentContext;
private ICompositeViewEngine _viewEngine;
///
/// Gets the .
///
public HttpContext HttpContext
{
get
{
return ViewContext?.HttpContext;
}
}
///
/// Gets the .
///
public HttpRequest Request
{
get
{
return ViewContext?.HttpContext?.Request;
}
}
///
/// Gets the for the current user.
///
public IPrincipal User
{
get
{
return ViewContext?.HttpContext?.User;
}
}
///
/// Gets the for the current request.
///
public RouteData RouteData
{
get
{
return ViewContext?.RouteData;
}
}
///
/// Gets the view bag.
///
public dynamic ViewBag
{
get
{
if (_viewBag == null)
{
_viewBag = new DynamicViewData(() => ViewData);
}
return _viewBag;
}
}
///
/// Gets the .
///
public ModelStateDictionary ModelState
{
get
{
return ViewData?.ModelState;
}
}
///
/// Gets or sets the .
///
public IUrlHelper Url
{
get
{
if (_url == null)
{
// May be null in unit-testing scenarios.
var services = ViewComponentContext.ViewContext?.HttpContext?.RequestServices;
_url = services?.GetRequiredService();
}
return _url;
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_url = value;
}
}
[ViewComponentContext]
public ViewComponentContext ViewComponentContext
{
get
{
// This should run only for the ViewComponent unit test scenarios.
if (_viewComponentContext == null)
{
_viewComponentContext = new ViewComponentContext();
}
return _viewComponentContext;
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_viewComponentContext = value;
}
}
///
/// Gets the .
///
public ViewContext ViewContext
{
get
{
return ViewComponentContext.ViewContext;
}
}
///
/// Gets the .
///
public ViewDataDictionary ViewData
{
get
{
return ViewComponentContext.ViewData;
}
}
///
/// Gets or sets the .
///
public ICompositeViewEngine ViewEngine
{
get
{
if (_viewEngine == null)
{
// May be null in unit-testing scenarios.
var services = ViewComponentContext.ViewContext?.HttpContext?.RequestServices;
_viewEngine = services?.GetRequiredService();
}
return _viewEngine;
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_viewEngine = value;
}
}
///
/// Returns a result which will render HTML encoded text.
///
/// The content, will be HTML encoded before output.
/// A .
public ContentViewComponentResult Content(string content)
{
if (content == null)
{
throw new ArgumentNullException(nameof(content));
}
return new ContentViewComponentResult(content);
}
///
/// Returns a result which will render JSON text.
///
/// The value to output in JSON text.
/// A .
public JsonViewComponentResult Json(object value)
{
return new JsonViewComponentResult(value);
}
///
/// Returns a result which will render JSON text.
///
/// The value to output in JSON text.
/// The to be used by
/// the formatter.
/// A .
/// Callers should cache an instance of to avoid
/// recreating cached data with each call.
public JsonViewComponentResult Json(object value, JsonSerializerSettings serializerSettings)
{
if (serializerSettings == null)
{
throw new ArgumentNullException(nameof(serializerSettings));
}
return new JsonViewComponentResult(value, serializerSettings);
}
///
/// Returns a result which will render the partial view with name "Default".
///
/// A .
public ViewViewComponentResult View()
{
return View