2011-05-20 4 views
0

J'ai lu tout sur UpdateModel() et les classeurs de modèles personnalisés et je ne peux toujours pas comprendre cela. On dirait que theres doit être une réponse simple à cela.Comment lier un modèle imbriqué dans MVC3?

J'ai une classe appelée utilisateur que j'utilise partout dans mon application Web MVC.

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

Et puis un WorkTask qu'il a en quelques endroits:

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

Alors, comment puis-je faire un créer des modèles pour cette WorkTask qui permet à la classe utilisateur à être lié à la WorkTask multiple des endroits?

Voilà ma tentative très mauvaise qualité:

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

et la vue:

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

Répondre

0

Au lieu d'essayer de lier l'objet imbriqué de l'utilisateur, je l'ai fait la forme et le contrôleur basé sur un ViewModel qui vient avait l'ID utilisateur. J'ai alors supposé que si le ViewModel validé correctement, que je peux aller de l'avant et persister le WorkTask et les objets Utilisateur imbriqués.

Questions connexes