2014-02-19 53 views
0

好吧,看起来有人应该遇到这种情况,但我还没有找到任何有用的东西。这是我的场景。如何构建多对多关系的创建视图

我有一个客户和技能模型。其目标是让客户对每一套技能进行评分。

所以,在这里,我将粘贴模型,视图模型,控制器和视图。在最后的关键问题

模型

namespace ClientSkills.Models 
{ 
public class Client 
{ 
    public int ClientId { get; set; } 
    public string Name { get; set; } 

    public ICollection<ClientSkills> Skills { get; set; } 

} 

public class Skill 
{ 
    public int SkillId { get; set; } 
    public string Name { get; set; } 

    public ICollection<ClientSkills> Clients { get; set; } 
} 

public class Rating 
{ 
    public int RatingId { get; set; } 
    public string Name { get; set; } 

    public ICollection<ClientSkills> ClientSkills { get; set; } 

} 

public class ClientSkills 
{ 
    [Key, Column(Order=0)] 
    public int ClientId { get; set; } 

    [Key, Column(Order = 1)] 
    public int SkillId { get; set; } 
    public int RatingId { get; set; } 

    public Rating Rating { get; set; } 
    public Skill Skill { get; set; } 
    public Client Client { get; set; } 
} 

public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Client> Client { get; set; } 
    public DbSet<Skill> Skill { get; set; } 
    public DbSet<Rating> Rating { get; set; } 
    public DbSet<ClientSkills> ClientSkills { get; set; } 

} 

} 

视图模型

namespace ClientSkills.Models 
{ 
public class RateViewModel 
{ 
    public RateViewModel() 
    { 
     this.Skills = new List<SkillViewModel>(); 
    } 

    public RateViewModel(Client client) 
    { 
     this.ClientId = client.ClientId; 
     this.Skills = new List<SkillViewModel>(); 
     if (client.Skills.Count == 0) 
     { 
      var context = new ApplicationDbContext(); 
      foreach (var skill in context.Skill) 
      { 
       var skillVM = new SkillViewModel(skill); 
       skillVM.SelectedRatingid = context.Rating.First(r => r.Name == "No aplica").RatingId; 
       Skills.Add(skillVM); 
      } 
     } 
     else 
     { 
      foreach (var item in client.Skills) 
      { 
       var skillVM = new SkillViewModel(item); 
       skillVM.SelectedRatingid = item.SkillId; 
       this.Skills.Add(skillVM); 
      } 
     } 
    } 

    public int ClientId { get; set; } 

    public List<SkillViewModel> Skills { get; set; } 

} 

public class SkillViewModel 
{ 

    public SkillViewModel() 
    { 
     Ratings = new List<Rating>(); 
    } 
    public SkillViewModel(Skill skill) 
    { 
     var context = new ApplicationDbContext(); 
     this.Ratings = context.Rating.ToList(); 
     this.SkillId = skill.SkillId; 
     this.SkillName = skill.Name; 
    } 

    public SkillViewModel(ClientSkills item) 
    { 
     var context = new ApplicationDbContext(); 
     this.Ratings = context.Rating.ToList(); 
     this.SkillId = item.SkillId; 
     this.SkillName = item.Skill.Name; 
     this.SelectedRatingid = item.RatingId; 
    } 
    public List<Rating> Ratings { get; set; } 
    public int SelectedRatingid { get; set; } 
    public int SkillId { get; set; } 
    public string SkillName { get; set; } 

} 
} 

控制器

namespace ClientSkills.Controllers 
{ 
public class RateController : Controller 
{ 
    // 
    // GET: /Rate/Create 
    public ActionResult Create() 
    { 
     //first, we assume there is an already selected user 
     var context = new ApplicationDbContext(); 

     var client = context 
      .Client 
      .Include(c => c.Skills) 
      .First(c => c.Name.ToLower() == "ricker"); 
     var model = new RateViewModel(client); 
     return View(model); 
    } 
} 
} 

VIEW

此视图是由创建与向导创建视图,删除它创建的无用场,并把下面

<table> 
     <tr> 
      <td>Skill</td> 
      <td>Rate</td> 
     </tr> 
     @foreach (var item in Model.Skills) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(model => model.Skills.First(i => i.SkillName == item.SkillName).SkillName, new { @class = "control-label col-md-2" }) 
       </td> 
       <td> 
        @Html.DropDownListFor(x => item.SelectedRatingid, new SelectList(item.Ratings, "RatingId", "Name"), "Seleccione el valor") 
       </td> 
      </tr> 
     } 
</table> 

问题的代码是在该行skillVM.SelectedRatingid = context.Rating.First(r => r.Name == "No aplica").RatingId;我的RateViewModel(Client client)构造为selectedRatingId属性设置默认值。我需要确保所有客户都具备所有技能,即使他们忘记或绕过其中一个。

加载视图时,我确信ratesid已设置好,技能名称看起来不错,但drop dpwn列表不显示选定的默认值。

如何使视图将selectedRatingId属性绑定到下拉列表控件?

+1

我不是.net mvc专业版,很抱歉,如果这是一个愚蠢的评论。你可以试试像''''SelectList'''构造函数的另一个重载:''@ Html.DropDownListFor(x => item.SelectedRatingid,new SelectList(item.Ratings,“RatingId”,“Name”,item.SelectedRatingid ),“Seleccione el valor”)'''通知第四个参数为''''SelectList''' – Varinder

+0

当然,我会尝试和发布 –

+0

它工作!请psot它作为答案给你的观点。有什么不同?这是我第一次使用那个超载 –

回答

1

传递选定的值到的SelectList:

@Html.DropDownListFor(x => item.SelectedRatingid, new SelectList(item.Ratings, "RatingId", "Name", item.SelectedRatingid), "Seleccione el valor") 

据我所知(正确或错误),该最后一个参数是一个对象,如果它与选择值中的一个相匹配 - 这是选择其他的第一个中选项被选中。

有关Selectlist过载的更多信息。