MVC动态控件命名不正确

时间:2014-08-01 16:50:17

标签: c# asp.net-mvc asp.net-mvc-4

我在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; }
}

我有以类似方式定义的文本框,复选框和下拉列表。我遇到的问题是当控件显示在页面上时,他们的nameid属性未按预期呈现。在我的控制器中我有

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)

问题是,当页面呈现时,nameid属性不会呈现为实际的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>

    

有谁知道如何正确填充nameid属性?

0 个答案:

没有答案