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

在Razor编辑器模板中获取模型变量名并生成对应ID

在Razor EditorTemplates中获取模型变量名生成ID的方案

我来帮你搞定这个问题!在Razor的EditorTemplates里,其实已经有现成的方式能拿到当前模型对应的属性(变量)名称,核心就是利用ViewData.ModelMetadata对象,下面一步步给你说明怎么实现:

1. 核心:获取当前属性名称

在你的ConceptViewModel对应的EditorTemplate(比如放在~/Views/Shared/EditorTemplates/ConceptViewModel.cshtml)里,直接通过ViewData.ModelMetadata.PropertyName就能拿到父模型里的属性名——比如渲染InputDataCollectionViewModel里的Definition时,这个值就是"Definition",渲染Publication时就是"Publication",完美符合你生成ID的需求。

2. 完整的EditorTemplate示例代码

把你的模板改成这样,就能自动生成带变量名前缀的ID:

@model ConceptViewModel

<div class="concept-group">
    <!-- 内容输入框 -->
    <label for="@($"{ViewData.ModelMetadata.PropertyName}_Content")">内容</label>
    <textarea 
        id="@($"{ViewData.ModelMetadata.PropertyName}_Content")" 
        name="@($"{ViewData.ModelMetadata.PropertyName}.Content")" 
        class="form-control">
        @Model.Content
    </textarea>

    <!-- 英文内容输入框 -->
    <label for="@($"{ViewData.ModelMetadata.PropertyName}_EnglishContent")">英文内容</label>
    <textarea 
        id="@($"{ViewData.ModelMetadata.PropertyName}_EnglishContent")" 
        name="@($"{ViewData.ModelMetadata.PropertyName}.EnglishContent")" 
        class="form-control">
        @Model.EnglishContent
    </textarea>

    <!-- 说明输入框 -->
    <label for="@($"{ViewData.ModelMetadata.PropertyName}_Instructions")">说明</label>
    <input 
        type="text" 
        id="@($"{ViewData.ModelMetadata.PropertyName}_Instructions")" 
        name="@($"{ViewData.ModelMetadata.PropertyName}.Instructions")" 
        value="@Model.Instructions" 
        class="form-control" />
</div>

这里的逻辑很简单:用父属性名(比如Definition)加上下划线和当前模型的属性名(比如Content),生成唯一的ID;而name属性保持MVC的绑定格式(比如Definition.Content),这样表单提交时模型绑定能正常工作。

3. 在父视图中调用模板

在InputDataCollectionViewModel对应的视图里,正常使用Html.EditorFor即可,它会自动匹配到你的EditorTemplate,并且传递正确的属性名称:

@model InputDataCollectionViewModel

<div class="input-collection">
    @Html.EditorFor(m => m.Definition)
    @Html.EditorFor(m => m.Publication)

    <div class="form-check">
        <input type="checkbox" id="Exist" name="Exist" checked="@Model.Exist" class="form-check-input" />
        <label for="Exist" class="form-check-label">是否存在</label>
    </div>
</div>

这样渲染出来的HTML里,Definition对应的内容输入框ID就是Definition_Content,Publication对应的就是Publication_Content,完全满足你根据模型变量名生成ID的需求。

额外小提示

  • 确保你的EditorTemplate文件名和模型类名完全一致(比如ConceptViewModel.cshtml对应ConceptViewModel类),这样Html.EditorFor才能自动找到对应的模板;如果需要自定义模板名称,可以用Html.EditorFor(m => m.Definition, "CustomTemplateName")指定。
  • 如果遇到多层嵌套的模型,ViewData.ModelMetadata.PropertyPath会返回完整的属性路径(比如Parent.Definition),你可以根据需求选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:08:12