diff --git a/zero.Debug/Renderers/meta.partial.js b/zero.Debug/Renderers/meta.partial.js index be5a22fe..f83e5281 100644 --- a/zero.Debug/Renderers/meta.partial.js +++ b/zero.Debug/Renderers/meta.partial.js @@ -14,7 +14,7 @@ export default [ }, { tab: 'meta', - field: 'meta.titleOverride', + field: 'meta.titleOverrideAll', display: 'text', label: 'Title override all' }, @@ -27,7 +27,7 @@ export default [ }, { tab: 'meta', - field: 'meta.seoImage', + field: 'meta.seoImageId', display: 'media', label: 'SEO image' }, diff --git a/zero.Debug/TestData/Pages/Partials/MetaPagePartial.cs b/zero.Debug/TestData/Pages/Partials/MetaPagePartial.cs index aa704eaa..ea07aed0 100644 --- a/zero.Debug/TestData/Pages/Partials/MetaPagePartial.cs +++ b/zero.Debug/TestData/Pages/Partials/MetaPagePartial.cs @@ -12,7 +12,7 @@ namespace zero.TestData public string SeoDescription { get; set; } - public Media SeoImage { get; set; } + public string SeoImageId { get; set; } public bool NoFollow { get; set; } diff --git a/zero.Web.UI/App/components/forms/property.vue b/zero.Web.UI/App/components/forms/property.vue index 0662eac1..b60dfbdd 100644 --- a/zero.Web.UI/App/components/forms/property.vue +++ b/zero.Web.UI/App/components/forms/property.vue @@ -51,7 +51,7 @@ .ui-property + .ui-property { padding-top: 30px; - margin-top: 50px; + margin-top: 30px; border-top: 1px solid var(--color-line-light); } diff --git a/zero.Web.UI/App/components/tabs/tabs.vue b/zero.Web.UI/App/components/tabs/tabs.vue index 8248a020..f632124b 100644 --- a/zero.Web.UI/App/components/tabs/tabs.vue +++ b/zero.Web.UI/App/components/tabs/tabs.vue @@ -113,7 +113,7 @@ { display: inline-flex; align-items: center; - height: 58px; + height: 56px; overflow: hidden; padding: 0 var(--padding); font-size: var(--font-size); @@ -121,12 +121,7 @@ position: relative; transition: color 0.2s ease; border-radius: var(--radius) var(--radius) 0 0; - background: rgba(white, 0.4); - - .theme-dark & - { - background: rgba(black, 0.5); - } + background: var(--color-bg-xxlight); & + .ui-tabs-list-item { @@ -177,10 +172,10 @@ background: var(--color-bg); } - &:before + /*&:before { background: var(--color-secondary); - } + }*/ &:after { diff --git a/zero.Web/Controllers/BackofficeController.cs b/zero.Web/Controllers/BackofficeController.cs index 5fbcfef4..0a22a723 100644 --- a/zero.Web/Controllers/BackofficeController.cs +++ b/zero.Web/Controllers/BackofficeController.cs @@ -17,6 +17,7 @@ namespace zero.Web.Controllers { [ZeroAuthorize] [BackofficeGenericController] + [ServiceFilter(typeof(ModelStateValidationFilterAttribute))] public abstract class BackofficeController : Controller, ISupportsGenericsController { IMapper _mapper; diff --git a/zero.Web/Filters/BackofficeGenericControllerAttribute.cs b/zero.Web/Filters/BackofficeGenericControllerAttribute.cs index 430bb945..9697ca2d 100644 --- a/zero.Web/Filters/BackofficeGenericControllerAttribute.cs +++ b/zero.Web/Filters/BackofficeGenericControllerAttribute.cs @@ -6,11 +6,16 @@ namespace zero.Web.Filters { public class BackofficeGenericControllerAttribute : Attribute, IControllerModelConvention { + const char BACKTICK = '`'; + + const string CONTROLLER = "Controller"; + + public void Apply(ControllerModel controller) { - if (controller.ControllerName.Contains('`')) + if (controller.ControllerName.Contains(BACKTICK)) { - controller.ControllerName = controller.ControllerName.Split('`')[0].TrimEnd("Controller"); + controller.ControllerName = controller.ControllerName.Split(BACKTICK)[0].TrimEnd(CONTROLLER); } } } diff --git a/zero.Web/Filters/ModelStateValidationFilterAttribute.cs b/zero.Web/Filters/ModelStateValidationFilterAttribute.cs new file mode 100644 index 00000000..183f5597 --- /dev/null +++ b/zero.Web/Filters/ModelStateValidationFilterAttribute.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace zero.Web.Filters +{ + public class ModelStateValidationFilterAttribute : IActionFilter + { + public void OnActionExecuting(ActionExecutingContext context) + { + if (!context.ModelState.IsValid) + { + context.Result = new BadRequestObjectResult(context.ModelState); + } + } + + public void OnActionExecuted(ActionExecutedContext context) + { + } + } +} diff --git a/zero.Web/ZeroBuilder.cs b/zero.Web/ZeroBuilder.cs index 4426c8bb..28804855 100644 --- a/zero.Web/ZeroBuilder.cs +++ b/zero.Web/ZeroBuilder.cs @@ -22,6 +22,7 @@ using zero.Core.Options; using zero.Core.Plugins; using zero.Core.Validation; using zero.Web.Defaults; +using zero.Web.Filters; namespace zero.Web { @@ -100,6 +101,8 @@ namespace zero.Web Services.AddTransient(); Services.AddTransient(typeof(IAppScope<>), typeof(AppScope<>)); + Services.AddScoped(); + Services.AddHttpContextAccessor(); Services.AddTransient();