Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将包含IEnumerable模型(复杂)的模型从视图C#MVC3传递到控制器?_C#_Asp.net Mvc 3_Forms_Model - Fatal编程技术网

如何将包含IEnumerable模型(复杂)的模型从视图C#MVC3传递到控制器?

如何将包含IEnumerable模型(复杂)的模型从视图C#MVC3传递到控制器?,c#,asp.net-mvc-3,forms,model,C#,Asp.net Mvc 3,Forms,Model,我已经浏览了这个网站上的其他问题和答案,但找不到我需要的答案 我有一个StudentRecord实体: public class StudentRecord : Persistent { public virtual string LastName { get; set; } public virtual string FirstName { get; set; } public virtual DateTime Dob { get; set; }

我已经浏览了这个网站上的其他问题和答案,但找不到我需要的答案

我有一个StudentRecord实体:

public class StudentRecord : Persistent {
        public virtual string LastName { get; set; }
        public virtual string FirstName { get; set; }
        public virtual DateTime Dob { get; set; }
        public virtual int StudentRef { get; set; }
        public virtual IEnumerable<StudentAddress> Addresses { get; set; }
        public virtual StudentAddress Address { get; set; }
        public virtual string Notes { get; set; }
    }
我正在将学生记录传递给viewmodel中包含的视图:

public class UserViewModel {
        public StudentRecord Student;      
        public ICurrentUserService CurrentUserService;
        public ParentUser ParentUser;        
    }
然后将其显示在表单中以便编辑,然后提交表单将StudentRecord传递回控制器。除StudentRecord中的地址为空外,所有工作正常。StudentRecord中的单个StudentAddress用于添加新地址,这也很好

是否可以编辑地址并将其发送回控制器,或者我是否需要在单独的页面上以单独的形式保存这些地址?我可以这样做,但我更愿意把一切都放在一起

我的问题可能是这不可能,也可能是我把地址写进表格的方式。一个学生可能有多个地址

以下是表单:(为了清晰起见,我去掉了一些html布局。“添加另一个地址”勾选框显示了带有jquery的新学生地址部分。)

@使用(Html.BeginForm()){
个人资料
全名:@Html.TextBoxFor(x=>x.Student.FirstName)@Html.TextBoxFor(x=>x.Student.LastName)
DOB:@Html.TextBoxFor(x=>x.Student.DOB)
@if(Model.Student.Addresses.Any()){
//仅打印存在的地址
整数计数=1;
int元素=0;
@if(Model.Student.Addresses.Count()>1){
foreach(Model.Student.Addresses中的var地址){
学生地址@count
收件人@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.address)
Property@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.Property)
District@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.District)
Postal Town@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.PostalTown)
County@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.County)
Postcode@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(element.Postcode)
计数++;
元素++;
}//结束foreach
}否则{
学生地址
收件人@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0.address)
Property@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0.Property)
District@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0.District)
Postal Town@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0.PostalTown)
County@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0.County)
Postcode@Html.TextBoxFor(x=>x.Student.Addresses.ElementAt(0).邮政编码)
}@*end if(Model.Student.Addresses.Count()>1)*@
添加另一个地址@Html.CheckBox(“添加另一个地址”,false,new{@id=“newBox”})
新学生地址
收件人@Html.TextBoxFor(x=>x.Student.Address.Address)
Property@Html.TextBoxFor(x=>x.Student.Address.Property)
District@Html.TextBoxFor(x=>x.Student.Address.District)
Postal Town@Html.TextBoxFor(x=>x.Student.Address.PostalTown)
country@Html.TextBoxFor(x=>x.Student.Address.country)
Postcode@Html.TextBoxFor(x=>x.Student.Address.Postcode)
}否则{
没有这个学生的地址。
}@*end if(Model.Student.Addresses.Any())*@
注释:@Html.TextAreaFor(x=>x.Student.Notes,新的{@style=“width:100%;”})
}@*表格结束*@

问题在于文本输入控件的
名称
属性不包含正确的值。我邀请您阅读,以更好地理解默认模型绑定器绑定到集合和词典时使用的约定

然后,我建议您使用编辑器模板,而不是在视图中编写foreach循环:

@using (Html.BeginForm()) {
    Personal Details

    @Html.LabelFor(x => x.Student.FirstName, "Full Name:")
    @Html.EditorFor(x => x.Student.FirstName) 
    @Html.EditorFor(x => x.Student.LastName)

    @Html.LabelFor(x => x.Student.Dob, "DOB:")
    @Html.TextBoxFor(x => x.Student.Dob)

    @if (Model.Student.Addresses.Any()) {
        @Html.EditorFor(x => x.Student.Addresses)
    } else {
        <text>No address for this student.</text>
    }

    @Html.LabelFor(x => x.Student.Notes, "Notes:")
    @Html.TextAreaFor(x => x.Student.Notes, new { @style = "width: 100%;"})

    <input type="submit" value="Send" class="btn btn-primary" style="clear: both;"/>
}

但这一切都是静态的。如果您希望能够动态添加和删除地址,我邀请您阅读Steven Sanderson的文章,他在文章中演示了如何使用自定义HTML帮助程序为输入字段(
HTML.BeginCollectionItem
)生成适当的名称,并使用AJAX添加新行。

感谢您的快速回复。我将试试看你建议的阅读材料。我会把结果贴在这里。非常感谢。谢谢你,这非常有效。我还将研究动态添加地址。
@using (Html.BeginForm()) {
    Personal Details
    Full Name: @Html.TextBoxFor(x => x.Student.FirstName) @Html.TextBoxFor(x => x.Student.LastName)
    DOB: @Html.TextBoxFor(x => x.Student.Dob)

    @if (Model.Student.Addresses.Any()) {
        // Only print addresses if they exist
            int count = 1;
            int element = 0;
                @if (Model.Student.Addresses.Count() > 1) {
                    foreach (var address in Model.Student.Addresses) {
                        Student Address @count
                        Addressee @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).Addressee)
                        Property @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).Property)
                        District @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).District)
                        Postal Town @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).PostalTown)
                        County @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).County)
                        Postcode @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(element).Postcode)
                        count++;
                        element++;
                    } //end foreach
                } else {
                    Student Address
                    Addressee @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).Addressee)
                    Property @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).Property)
                    District @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).District)
                    Postal Town @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).PostalTown)
                    County @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).County)
                    Postcode @Html.TextBoxFor(x => x.Student.Addresses.ElementAt(0).Postcode)
                } @*end if (Model.Student.Addresses.Count() > 1)*@

                Add another address @Html.CheckBox("Add another address", false, new {@id = "newBox"})

                New Student Address
                Addressee @Html.TextBoxFor(x => x.Student.Address.Addressee)
                Property @Html.TextBoxFor(x => x.Student.Address.Property)
                District @Html.TextBoxFor(x => x.Student.Address.District)
                Postal Town @Html.TextBoxFor(x => x.Student.Address.PostalTown)
                County @Html.TextBoxFor(x => x.Student.Address.County)
                Postcode @Html.TextBoxFor(x => x.Student.Address.Postcode)
    } else {
        No address for this student.
    } @*end if (Model.Student.Addresses.Any())*@

    Notes: @Html.TextAreaFor(x => x.Student.Notes, new { @style = "width: 100%;"})

    <input type="submit" value="Send" class="btn btn-primary" style="clear: both;"/>
} @*end of form*@
@using (Html.BeginForm()) {
    Personal Details

    @Html.LabelFor(x => x.Student.FirstName, "Full Name:")
    @Html.EditorFor(x => x.Student.FirstName) 
    @Html.EditorFor(x => x.Student.LastName)

    @Html.LabelFor(x => x.Student.Dob, "DOB:")
    @Html.TextBoxFor(x => x.Student.Dob)

    @if (Model.Student.Addresses.Any()) {
        @Html.EditorFor(x => x.Student.Addresses)
    } else {
        <text>No address for this student.</text>
    }

    @Html.LabelFor(x => x.Student.Notes, "Notes:")
    @Html.TextAreaFor(x => x.Student.Notes, new { @style = "width: 100%;"})

    <input type="submit" value="Send" class="btn btn-primary" style="clear: both;"/>
}
@model StudentAddress
@Html.LabelFor(x => x.Addressee, "Addressee")
@Html.EditorFor(x => x.Addressee)

@Html.LabelFor(x => x.Property, "Property")
@Html.EditorFor(x => x.Property)

@Html.LabelFor(x => x.District, "District")
@Html.EditorFor(x => x.District)

@Html.LabelFor(x => x.PostalTown, "Postal Town")
@Html.EditorFor(x => x.PostalTown)

@Html.LabelFor(x => x.County, "County")
@Html.EditorFor(x => x.County)

@Html.LabelFor(x => x.Postcode, "Postcode")
@Html.EditorFor(x => x.Postcode)