能否按此方式使用Umbraco宏?求带控制器与自定义模型的宏实现方法
嘿,我来帮你搞定这个Umbraco宏的需求!结合你给出的PersonalDetail模型,咱们一步步实现能嵌入PageType、带自定义控制器的宏:
1. 完善自定义模型
首先补全你的模型代码,顺便调整下命名规范(符合C#惯例),加上必要的验证和显示特性:
using System.ComponentModel.DataAnnotations; using System.Globalization; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Web.Common.Models; public class PersonalDetail : RenderModel { public PersonalDetail(IPublishedContent content) : base(content) { } public PersonalDetail(IPublishedContent content, CultureInfo culture) : base(content, culture) { } public decimal Pk { get; set; } [Required(ErrorMessage = "First name is required")] [Display(Name = "First Name")] public string FirstName { get; set; } [Required(ErrorMessage = "Last name is required")] [Display(Name = "Last Name")] public string LastName { get; set; } // 可根据需求继续添加属性,比如Email、Phone等 }
注意:继承RenderModel能让你的模型直接访问当前Umbraco页面的IPublishedContent数据,如果你的宏不需要关联页面内容,也可以选择不继承,直接用普通ViewModel。
2. 创建宏的Surface控制器
在Umbraco中,处理宏的交互逻辑(比如表单提交)通常用SurfaceController,创建一个控制器类:
using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Web.Common.Controllers; public class PersonalDetailSurfaceController : SurfaceController { // 宏的默认展示Action,返回Partial View public IActionResult Index(IPublishedContent currentContent) { // 初始化模型,传入当前页面的内容 var model = new PersonalDetail(currentContent); return PartialView("~/Views/Partials/Macros/PersonalDetail.cshtml", model); } // 处理表单提交的Action(如果需要) [HttpPost] public IActionResult SubmitPersonalDetail(PersonalDetail model) { if (!ModelState.IsValid) { // 验证失败,返回原视图并保留错误信息 return PartialView("~/Views/Partials/Macros/PersonalDetail.cshtml", model); } // 这里写你的业务逻辑,比如保存到数据库、发送邮件等 // 示例:_personalDetailService.Save(model); // 设置成功提示,重定向回当前页面 TempData["SuccessMessage"] = "Personal details submitted successfully!"; return RedirectToCurrentUmbracoPage(); } }
3. 创建宏对应的Partial View
在~/Views/Partials/Macros目录下创建PersonalDetail.cshtml视图,关联你的模型:
@model PersonalDetail @if (TempData["SuccessMessage"] != null) { <div class="alert alert-success">@TempData["SuccessMessage"]</div> } @using (Html.BeginUmbracoForm<PersonalDetailSurfaceController>(nameof(PersonalDetailSurfaceController.SubmitPersonalDetail))) { <div class="form-group"> @Html.LabelFor(m => m.FirstName) @Html.TextBoxFor(m => m.FirstName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.FirstName) </div> <div class="form-group"> @Html.LabelFor(m => m.LastName) @Html.TextBoxFor(m => m.LastName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.LastName) </div> <button type="submit" class="btn btn-primary">Submit</button> }
4. 在Umbraco后台创建宏
- 登录Umbraco后台,进入Settings > Macros
- 点击Create按钮,填写宏名称(比如“Personal Detail Form”)
- 在View选项中,选择你刚才创建的Partial View:
~/Views/Partials/Macros/PersonalDetail.cshtml - 如果需要给宏设置可配置参数(比如是否显示提交按钮),可以在Parameters标签页添加,之后在视图中接收使用
- 保存宏
5. 将宏嵌入到PageType(文档类型)
有两种常用方式:
- 方式一:添加宏容器属性
- 进入Settings > Document Types,编辑你要嵌入宏的PageType
- 添加新属性,属性类型选择Macro Container
- 保存文档类型后,在内容编辑页面,就能在该属性中插入你创建的“Personal Detail Form”宏
- 方式二:直接在模板中调用宏
如果希望该宏固定出现在某个PageType的所有页面中,可直接在对应模板里添加:@await Umbraco.RenderMacroAsync("Personal Detail Form")
这样一套流程下来,你就拥有了一个带自定义模型、控制器,并且能灵活嵌入到PageType的Umbraco宏啦!如果有其他需求(比如宏的权限控制、样式定制),可以再针对性调整。
内容的提问来源于stack exchange,提问作者Kobie
相关产品推荐
相关产品推荐

