我正在构建一个CMS,我可以动态地说明将显示哪些类型的编辑器。例如,在一种类型的页面上,我可能需要一个文本框和一个文本区域,另一个是文本框和日期选择器
我已经定义了字段
public class CMSField
{
public string Label { get; set; }
}
public class CMSTextField : CMSField
{
public string Value { get; set; }
}
public class CMSDatePickerField : CMSField
{
public DatePickerControl Value { get; set; }
}
我的观点模型
public class CmsVM
{
public List<CMSField> fields { get; set; }
public CmsVM()
{
fields= new List<CMSField>();
}
}
然后在控制器中我可以像这样设置它(现在手动定义,但将在其他地方定义):
public ActionResult Add()
{
CmsVM model = new CmsVM();
model.fields.Add(new CMSTextField() { Label = "Title", Value = "" });
model.fields.Add(new CMSDatePickerField()
{
Label = "Date",
Value = new DatePickerControl
{
SelectedDate = DateTime.Now
}
});
return View("Add", "_FormLayout", model);
}
然后在我看来,我展示了相关的编辑器 e.g。
@model CmsVM
@for (var i = 0; i < Model.fields.Count(); i++)
{
var cmsField = Model.fields[i];
if (cmsField is CMSTextField)
{
var textBox = (CMSTextField)cmsField;
@Html.TextBoxFor(model => textBox.Value)
}
else if (cmsField is CMSDatePickerField)
{
var dp = (CMSDatePickerField)cmsField;
@Html.EditorFor(model => dp.Value)
@Html.ValidationMessageFor(model => dp.Value)
}
}
到目前为止一切顺利,我得到了我在控制器中定义的控件。但我现在需要处理回发。模型始终为空
[HttpPost]
public ActionResult AddNew(CmsVM model)
{
...
}
有没有更好的方法来设置它,以便我可以发布视图模型?