MVC 4中的动态形式控制



我想生成动态形式控件,其中形式变量及其各自的数据类型存储在mysql db表中。这是我用来渲染表单上的主变量的代码。但是我尝试过的选项有一些或其他问题。代码为:

labels.cs

public partial class Labels
{
   public int Label_Id { get; set; }
   public string Label_Name { get; set; }
   public string Form_Element_Type { get; set; }
}
public partial class Observation
{
   public int Observation_Id {get; set;}
   public int Employee_Id {get; set;}
   public int Label_Id {get; set;}
   public string Value {get; set;}
}

模型类

public class EmployeeModel
{
   public Dictionary<string, string> ObsDictionay { get; set; }
}

控制器

Public class EmployeeController
{
    Public ActionResult ProcessEmployee ()
{
      List<MasterLabel> masterLabels = new List<MasterLabel>();
                IMasterLabel masterLabelManager = new MasterLabelsManager();
                masterLabels = masterLabelManager.GetAll();
                model.MasterLabels = masterLabels;  
    IObservation obsManager = new ObservationManager();
                List<Observation> obsList = new List<Observation>();
                obsList = obsManager.GetAllByPatientId(id);
                Dictionary<string, string> ObsDictionay = new Dictionary<string, string>();
                foreach (var label in masterLabels)
                {
                    int flag = 0;
                    if (obsList.Count() > 0)
                    {
                        foreach (var obs in obsList)
                        {
                            if (label.Label_Id == obs.Label_Id)
                            {
                                ObsDictionay.Add(label.Label_Id.ToString(), obs.Value);
                                flag = 1;
                                break;
                            }
                        }
                        if (flag == 0)
                        {
                            ObsDictionay.Add(label.Master_Label_Id.ToString(), null);
                        }
                    }
                    else
                    {
                        ObsDictionay.Add(label.Master_Label_Id.ToString(), null);
                    }
                }
                model.ObsDictionay = ObsDictionay;

}
}

视图---我已经尝试过的选项,并且没有满足要求

选项1:

<input class="control-label" type="@item.Form_Element_Type" id="@item.Master_Label_Id" name="@item.Master_Label_Id "  value= @Model.ObsDictionay[item.Label_Id.ToString()]">

此选项将null obsdictionay重新调整为控制器中的[httppost]方法

选项2:

@Html.EditorFor(x => x.ObsDictionay[item.Label_Id.ToString()])

此选项将观察者恢复到控制器中的[httppost]方法,但所有值都在所有变量

的文本框中渲染文本框

选项3:

@if (item.Form_Element_Type == "checkbox")
{
     @Html.CheckBoxFor(x => x.ObsDictionay[item.Label_Id.ToString()] == "Y"? true : false)
}
else if(item.Form_Element_Type == "textbox")
{
@Html.TextAreaFor(x => x.ObsDictionay[item.Label_Id.ToString()])                                        
 }

错误:system.invalidoperationException:模板只能与字段访问,属性访问,单差不平阵列索引或单参数自定义索引器表达式一起使用,而渲染复选框。

>

有人可以帮助我。

选项1

应该是 <input class="control-label" type="@item.Form_Element_Type" id="@item.Master_Label_Id" name="@item.Master_Label_Name " value= @Model.ObsDictionay[item.Label_Id.ToString()]">

我不知道为什么您有@item.Master_Label_Id而不是@item.Label_Id

选项2

问题是@Html.EditorFor取决于属性类型 - 由于您所有字段均为string,因此文本框是所选的输入。您将不得不采用不同的字段类型才能使其正常工作(也许通过将object传递并将其打字到所需类型)。

选项3

我不认为@Html.CheckBoxFor(x => x.ObsDictionay[item.Label_Id.ToString()] == "Y"? true : false)是有效的原因,因为我记得您必须将表达式作为第一个参数传递。将其更改为@Html.CheckBoxFor(x => x.ObsDictionay[item.Label_Id.ToString()], new { Value = Model.ObsDictionay[item.Label_Id.ToString()] == "Y" ? true : false)

最新更新