You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否按此方式使用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后台创建宏
  1. 登录Umbraco后台,进入Settings > Macros
  2. 点击Create按钮,填写宏名称(比如“Personal Detail Form”)
  3. 在View选项中,选择你刚才创建的Partial View:~/Views/Partials/Macros/PersonalDetail.cshtml
  4. 如果需要给宏设置可配置参数(比如是否显示提交按钮),可以在Parameters标签页添加,之后在视图中接收使用
  5. 保存宏
5. 将宏嵌入到PageType(文档类型)

有两种常用方式:

  • 方式一:添加宏容器属性
    1. 进入Settings > Document Types,编辑你要嵌入宏的PageType
    2. 添加新属性,属性类型选择Macro Container
    3. 保存文档类型后,在内容编辑页面,就能在该属性中插入你创建的“Personal Detail Form”宏
  • 方式二:直接在模板中调用宏
    如果希望该宏固定出现在某个PageType的所有页面中,可直接在对应模板里添加:
    @await Umbraco.RenderMacroAsync("Personal Detail Form")
    

这样一套流程下来,你就拥有了一个带自定义模型、控制器,并且能灵活嵌入到PageType的Umbraco宏啦!如果有其他需求(比如宏的权限控制、样式定制),可以再针对性调整。

内容的提问来源于stack exchange,提问作者Kobie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:11:15