在Razor编辑器模板中获取模型变量名并生成对应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

