动态CMS ViewModel

时间:2017-09-27 09:36:47

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

我正在构建一个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)
    {
    ...
    }

有没有更好的方法来设置它,以便我可以发布视图模型?

0 个答案:

没有答案