【问题标题】:Post form get null values in Model发布表单在模型中获取空值
【发布时间】:2023-03-31 01:04:01
【问题描述】:

当我提交表单时,我的 ViewModel 中的课程列表得到空值。 这是我的 ViewModel:

public class CandidateViewModel
{
    public string Name { get; set; }
    public IList<CourseViewModel> Courses { get; set; }

    public CandidateViewModel()
    {
        Name = "Kiwanax";
        Courses = new List<CourseViewModel>();
        for (int count = 0; count < 5; ++count)
        {
            Courses.Add(new CourseViewModel( 
                string.Format("Course_{0}", count), 5));
        }
    } 
}

public class CourseViewModel
{
    public long ID { get; set; }
    public string Name { get; set; }
    public OptionViewModel SelectedOption { get; set; }
    public IList<OptionViewModel> Options { get; set; }

    public CourseViewModel(string name, int numberOfOptions) 
    {
        Name = name;
        Options = new List<OptionViewModel>();
        for (int count = 1; count <= numberOfOptions; ++count)
        {
            Options.Add(new OptionViewModel(count.ToString(), 
                string.Format("Option {0}", count)));
        }
        SelectedOption = Options[0];
    }
}

public class OptionViewModel
{
    public string Value { get; set; }
    public string Description { get; set; }
}

好的。当我根据我的 IList 创建 DropDownLists 时,它工作正常。

<ul id="cursos">
@for (int count = 0; count < Model.Courses.Count; ++count)
{
    <li>
        @Html.DropDownListFor(i => i.Courses[count].SelectedOption,
            new SelectList(Model.Courses[count].Options, "Value", "Description", Model.Courses[count].SelectedOption))
                @Html.HiddenFor(i => i.Courses[count].ID)
                @Model.Courses[count].Name
            </li>
        }
        </ul>

但是,当我从表单中发帖时,我会从该 IList 中获取空值。

【问题讨论】:

  • 这个 ID 在@Html.HiddenFor(i => i.Courses[count].ID) 中来自哪里?
  • 我将一个名为 ID 的属性放入 CourseViewModel。但是忘记写在这里了,抱歉。
  • 这个 CursosDisponiveis 对象是什么?你能显示更多代码吗?很难说是怎么回事?
  • 现在我修正了我的错误。我在主题结束时说过:当我从表单中发布时,名为 Courses 的 IList 正在获取空值。所有属性均为空。那是我的问题。
  • 问题出在这里@Html.DropDownListFor(i =&gt; i.Courses[count].SelectedOption, lambda 的右侧不应该是复杂类型

标签: c# asp.net-mvc-3 razor viewmodel


【解决方案1】:

您不能将下拉菜单绑定到复杂的属性值:

i => i.Courses[count].SelectedOption

它必须绑定到将发送到服务器的相应原始类型:

i => i.Courses[count].SelectedOption.Value

请记住,在 HTML 中,&lt;select&gt; 元素仅将选定的值作为简单的字符串类型发送到服务器。

【讨论】:

  • 谢谢,Darin,它解决了我的一个问题!现在,检查一下:当我将 trhu Javascript 任何内容更改为生成的选择元素时,我得到空值。例如:当我删除一些选项 trhu JS 时,我在帖子中得到空值!比如:
    $("courses li select").each(function() { if ($(this).val() == -1) $(this).attr('disabled', 'disabled') ; })
  • 如果您禁用或从列表中删除某些下拉列表,您会在索引中获得 holes 并且默认模型绑定器无法正确绑定这些值。阅读以下博客文章以了解绑定到集合的工作原理:haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx。所以你有 2 种可能性 => 1. 修复其他选择元素的索引(可能很难实现) 2. 如上一篇博文末尾所述,在元素名称中使用非顺序索引 - 在这种情况下你不会关心删除元素。
  • 另外,请确保您已阅读以下帖子,了解自定义 Html.BeginCollectionItem 帮助器的示例实现,该帮助器允许您生成非顺序索引:blog.stevensanderson.com/2010/01/28/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多