如何在MVC3中绑定嵌套模型?

发布于 2024-11-08 21:51:05 字数 4320 浏览 0 评论 0原文

我一直在阅读有关 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; }
}

然后是一个在几个地方都有它的 WorkTask:

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";
        }
    }
}

那么我如何为这个 WorkTask 创建一个模板,允许 User 类在多个地方绑定到 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);
    }

和观点:

@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>

I've been reading all about UpdateModel() and custom model binders and i still cant figure this out. Seems like theres gotta be a simple answer to this.

I have a class called user that i user all over my MVC Web app.

 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; }
}

And then a WorkTask that has it in a few places:

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";
        }
    }
}

So how do i make a create template for this WorkTask that allows the User class to be bound to the WorkTask in multiple places?

Here's my very shoddy attempt:

[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);
    }

and the view:

@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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

春风十里 2024-11-15 21:51:05

我没有尝试绑定嵌套的 User 对象,而是基于仅具有 UserID 的 ViewModel 制作了表单和控制器。然后我假设,如果 ViewModel 验证正确,那么我可以继续保留 WorkTask 和嵌套的 User 对象。

Instead of trying to bind the nested User object, i made the form and controller based upon a ViewModel which just had the UserID. I then assumed that if the ViewModel validated correctly, than i can go ahead and persist the WorkTask and nested User objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文