我想生成动态形式控件,其中形式变量及其各自的数据类型存储在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)