Asp.net mvc 3 如何在MVC3中绑定嵌套模型?

Asp.net mvc 3 如何在MVC3中绑定嵌套模型?,asp.net-mvc-3,razor,model-binding,Asp.net Mvc 3,Razor,Model Binding,我一直在阅读有关UpdateModel()和自定义模型绑定器的所有内容,但我仍然无法理解这一点。似乎有一个简单的答案 我有一个名为user的类,我在我的MVC Web应用程序中使用它 public class User { [Key] public int ID { get; set; } [Required] public string Name { get; set; } [Required] [Email] public str

我一直在阅读有关UpdateModel()和自定义模型绑定器的所有内容,但我仍然无法理解这一点。似乎有一个简单的答案

我有一个名为user的类,我在我的MVC Web应用程序中使用它

 public class User
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [Email]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }

    public virtual ICollection<User> WorkTasks { get; set; }
}
公共类用户
{
[关键]
公共int ID{get;set;}
[必需]
公共字符串名称{get;set;}
[必需]
[电邮]
公共字符串电子邮件{get;set;}
[必需]
公共字符串密码{get;set;}
公共虚拟ICollection工作任务{get;set;}
}
然后是一个在几个地方都有它的工作任务:

public class WorkTask
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public  DateTime? DesiredStartDate { get; set; }
    public  DateTime? DesiredEndDate { get; set; }


    public TimeSpan? DesiredTimeSpent { get; set; }

    public virtual ICollection<WorkTaskTag> Tags { get; set; }
    public virtual ICollection<WorkTaskPeriod> Periods { get; set; }

    public virtual ICollection<User> InvolvedUsers { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual User AssignedTo { get; set; }

    public string UserNameAssignedTo
    {
        get
        {
            if(AssignedTo!=null)
            return AssignedTo.Name;
            return CreatedBy.Name;
        }
    }

    public string TotalTimeSpent { 
        get
        {
            var concretePeriods = Periods
                .Where(i => i.StartDate.HasValue && i.EndDate.HasValue);
            if (concretePeriods != null && concretePeriods.Count() > 0)
            {
                TimeSpan ts = new TimeSpan();
                foreach (var p in concretePeriods)
                {
                    var t=p.EndDate.Value-p.StartDate.Value;
                    ts.Add(t);
                }
                TimePeriodHelpers help = new TimePeriodHelpers();
                return help.GetTimeFormat(ts);
            }
            return "0:00";
        }
    }
}
公共类工作任务
{
[关键]
公共int ID{get;set;}
[必需]
公共字符串名称{get;set;}
公共日期时间?DesiredStartDate{get;set;}
公共日期时间?DesiredEndDate{get;set;}
公共时间跨度?DesiredTimeSpan{get;set;}
公共虚拟ICollection标记{get;set;}
公共虚拟ICollection时段{get;set;}
公共虚拟ICollection涉及用户{get;set;}
公共虚拟用户通过{get;set;}创建
分配给{get;set;}的公共虚拟用户
公共字符串usernamesignedto
{
得到
{
if(AssignedTo!=null)
返回AssignedTo.Name;
返回CreatedBy.Name;
}
}
公共字符串TotalTimePent{
得到
{
var周期=周期
.Where(i=>i.StartDate.HasValue&&i.EndDate.HasValue);
if(concretePeriods!=null&&concretePeriods.Count()>0)
{
TimeSpan ts=新的TimeSpan();
foreach(特定时期的var p)
{
var t=p.EndDate.Value-p.StartDate.Value;
ts.Add(t);
}
TimePeriodHelpers帮助=新的TimePeriodHelpers();
返回help.GetTimeFormat(ts);
}
返回“0:00”;
}
}
}
那么,如何为这个WorkTask创建一个允许用户类在多个位置绑定到WorkTask的创建模板呢

以下是我的拙劣尝试:

[HttpPost]
    public ActionResult Create(WorkTask worktask)
    {
        LoadUsers();
        string assignedto=Request["AssignedTo"];
        var user = db.Users.First(i => SqlFunctions.StringConvert((double)i.ID) == assignedto);
        UpdateModel<User>(user);
        if (ModelState.IsValid)
        {
            db.WorkTasks.Add(worktask);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(worktask);
    }
[HttpPost]
公共操作结果创建(工作任务工作任务)
{
LoadUsers();
字符串assignedto=请求[“assignedto”];
var user=db.Users.First(i=>SqlFunctions.StringConvert((double)i.ID)==assignedto);
更新模型(用户);
if(ModelState.IsValid)
{
db.worktask.Add(worktask);
db.SaveChanges();
返回操作(“索引”);
}
返回视图(工作任务);
}
以及以下观点:

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.DesiredStartDate,"Desired Start Date")
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DesiredStartDate)
        @Html.ValidationMessageFor(model => model.DesiredStartDate)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.DesiredEndDate,"Desired End Date")
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DesiredEndDate)
        @Html.ValidationMessageFor(model => model.DesiredEndDate)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.DesiredTimeSpent,"Desired Time Spent")
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.DesiredTimeSpent)
        @Html.ValidationMessageFor(model => model.DesiredTimeSpent)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.AssignedTo,"User Assigned To")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(i=>Model.AssignedTo,(IEnumerable<SelectListItem>)ViewBag.Users)
        @Html.ValidationMessageFor(model => model.AssignedTo)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
@LabelFor(model=>model.Name)
@EditorFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
@LabelFor(model=>model.DesiredStartDate,“期望的开始日期”)
@EditorFor(model=>model.DesiredStartDate)
@Html.ValidationMessageFor(model=>model.DesiredStartDate)
@LabelFor(model=>model.DesiredEndDate,“期望的结束日期”)
@EditorFor(model=>model.desiredDate)
@Html.ValidationMessageFor(model=>model.DesiredEndDate)
@Html.LabelFor(model=>model.desiredTimeWasted,“所花费的所需时间”)
@Html.EditorFor(model=>model.desiredTime)
@Html.ValidationMessageFor(model=>model.desiredTime)
@LabelFor(model=>model.AssignedTo,“用户分配到”)
@(i=>Model.AssignedTo,(IEnumerable)ViewBag.Users)
@Html.ValidationMessageFor(model=>model.AssignedTo)


我没有尝试绑定嵌套的用户对象,而是基于刚刚具有用户ID的ViewModel创建了表单和控制器。然后我假设如果ViewModel验证正确,那么我可以继续并持久化WorkTask和嵌套的用户对象