我在MVC中创建可配置的表单,其中包含基于this SO post的动态控件。控件都是从我的基础ControlViewModel
构建的,它只包含所有控件的属性
public abstract class ControlViewModel
{
public abstract string Type { get; }
public bool Visible { get; set; }
public string Label { get; set; }
public string Name { get; set; }
}
每个控件类型都是通过继承ControlViewModel
public class TextBoxViewModel : ControlViewModel
{
public override string Type
{
get { return "textbox"; }
}
public string Value { get; set; }
}
我有以类似方式定义的文本框,复选框和下拉列表。我遇到的问题是当控件显示在页面上时,他们的name
和id
属性未按预期呈现。在我的控制器中我有
public ActionResult Index()
{
var model = new MyViewModel
{
Controls = new ControlViewModel[]
{
new TextBoxViewModel
{
Visible = true,
Label = "label 1",
Name = "TextBox1",
Value = "value of textbox"
}
}
}
return View(model)
}
在我的Index.cshtml
中,我像这样呈现每个控件:
@model DynamicForms.Models.MyViewModel
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Controls.Length; i++)
{
if (Model.Controls[i].Visible)
{
<div>
@Html.HiddenFor(x => x.Controls[i].Type)
@Html.HiddenFor(x => x.Controls[i].Name)
@Html.EditorFor(x => x.Controls[i])
</div>
}
}
<input type="submit" value="OK" />
}
编辑器只显示控件和标签
@model DynamicForms.Models.TextBoxViewModel
@Html.LabelFor(x => x.Value, Model.Label)
@Html.TextBoxFor(x => x.Value)
问题是,当页面呈现时,name
和id
属性不会呈现为实际的string
值,而是呈现为类型
<div>
<input id="Controls_0__Type" name="Controls[0].Type" type="hidden" value="textbox">
<input id="Controls_0__Name" name="Controls[0].Name" type="hidden" value="TextBox1">
<label for="Controls_0__Value">label 1</label>
有谁知道如何正确填充name
和id
属性?