1

更新:我为选择列表项添加了绑定排除。

现在,我知道没有 IEnumerable 类型的 ViewDataItem 有它们的键等等。

如果我不能将 viewModel 用于选择列表,那有什么意义呢?

在 POST 操作中出现此错误。我知道以前有人问过这个问题,但是我按照说明无济于事。有什么想法可能是错的吗?不确定我是否应该包含视图...

这是模型:

公共课外展{

    [DisplayName("Number of Mailings")]
    [Range(1, 100000,ErrorMessage="Please a positive number for Number of Mailings")]
    public int mailings { get; set; }
    [DisplayName("Number of Calls")]
    public int pcalls { get; set; }
    [DisplayName("Number of Emails")]
    public int emails { get; set; }
    [DisplayName("Number of Walkins")]
    public int walkins { get; set; }
    [DisplayName("Number of Faxes")]
    public int faxes { get; set; }
    public int osid { get; set; }
    public int month { get; set; }
    public int year { get; set; }

    public Outreach()
    {
    }
}
}

这是视图模型:

public class OutreachViewModel
  {
    [DisplayName("Outreach Specialist")]
    public SelectList OutreachSpecialist{ get; set; }
    public SelectList Year { get; set; }
    public SelectList Month { get; set; }

    public Outreach Out {get; set;}   
}

这是控制器:

public ActionResult Create()
        {
            List<tblOutreachSpecialist> spec = repo.getAllSpecialists();
            List<pYear> years=repo.getAllYears();
            List<pMonth> months=repo.getAllMonths();

            OutreachViewModel vw = new OutreachViewModel();

            vw.Year = new SelectList(years, "id", "pYear1");
            vw.Month = new SelectList(months, "id", "pMonth1");
            vw.OutreachSpecialist = new SelectList(spec, "OSID", "LastName");

            return View(vw);
        }

        [HttpPost]
        public ActionResult Create(OutreachViewModel vm)
        {
            if (ModelState.IsValid)
            {
                repo.Add(vm.Out);
                repo.Save();

            }
            return View(vm);
        }
4

1 回答 1

1

考虑为 post 方法使用不同的视图模型。

            public class OutreachViewModelForCreate
            {
                public Outreach Out { get; set; }
            }

然后,让您的发布操作采用更简单的视图模型。如果模型状态无效并且您需要重新显示视图以获取新的用户输入,则可以调用方法将创建视图模型转换为显示视图模型的实例:

            [HttpPost]
            public ActionResult Create(OutreachViewModelForCreate result)
            {
                if (ModelState.IsValid)
                {
                    //write to repo
                }
                var displayVm = getCreateDisplayViewModel();

                displayVm.Out = result.Out;

                return View(displayVm);
            }

您也可以使用自定义模型绑定器,但我个人更喜欢这种模式。

更新:我看到你使用了绑定排除。我会把这个留在这里以防万一。

于 2013-04-09T01:06:54.980 回答