summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Framework/Extensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Web/Framework/Extensions.cs')
-rw-r--r--src/SMAPI.Web/Framework/Extensions.cs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/SMAPI.Web/Framework/Extensions.cs b/src/SMAPI.Web/Framework/Extensions.cs
index e0da1424..3a246245 100644
--- a/src/SMAPI.Web/Framework/Extensions.cs
+++ b/src/SMAPI.Web/Framework/Extensions.cs
@@ -1,14 +1,24 @@
using System;
using JetBrains.Annotations;
+using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Razor;
+using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Routing;
+using Newtonsoft.Json;
namespace StardewModdingAPI.Web.Framework
{
/// <summary>Provides extensions on ASP.NET Core types.</summary>
public static class Extensions
{
+ /*********
+ ** Public methods
+ *********/
+ /****
+ ** View helpers
+ ****/
/// <summary>Get a URL with the absolute path for an action method. Unlike <see cref="IUrlHelper.Action"/>, only the specified <paramref name="values"/> are added to the URL without merging values from the current HTTP request.</summary>
/// <param name="helper">The URL helper to extend.</param>
/// <param name="action">The name of the action method.</param>
@@ -18,6 +28,7 @@ namespace StardewModdingAPI.Web.Framework
/// <returns>The generated URL.</returns>
public static string PlainAction(this IUrlHelper helper, [AspMvcAction] string action, [AspMvcController] string controller, object values = null, bool absoluteUrl = false)
{
+ // get route values
RouteValueDictionary valuesDict = new RouteValueDictionary(values);
foreach (var value in helper.ActionContext.RouteData.Values)
{
@@ -25,14 +36,31 @@ namespace StardewModdingAPI.Web.Framework
valuesDict[value.Key] = null; // explicitly remove it from the URL
}
+ // get relative URL
string url = helper.Action(action, controller, valuesDict);
+ if (url == null && action.EndsWith("Async"))
+ url = helper.Action(action[..^"Async".Length], controller, valuesDict);
+
+ // get absolute URL
if (absoluteUrl)
{
HttpRequest request = helper.ActionContext.HttpContext.Request;
Uri baseUri = new Uri($"{request.Scheme}://{request.Host}");
url = new Uri(baseUri, url).ToString();
}
+
return url;
}
+
+ /// <summary>Get a serialized JSON representation of the value.</summary>
+ /// <param name="page">The page to extend.</param>
+ /// <param name="value">The value to serialize.</param>
+ /// <returns>The serialized JSON.</returns>
+ /// <remarks>This bypasses unnecessary validation (e.g. not allowing null values) in <see cref="IJsonHelper.Serialize"/>.</remarks>
+ public static IHtmlContent ForJson(this RazorPageBase page, object value)
+ {
+ string json = JsonConvert.SerializeObject(value);
+ return new HtmlString(json);
+ }
}
}