Razor 如何为多对多关系构建创建视图

Razor 如何为多对多关系构建创建视图,razor,asp.net-mvc-5,Razor,Asp.net Mvc 5,好的,看起来应该有人碰到这个,但我没有发现任何有用的东西。这是我的设想 我有一个客户和技能模型。目标是让客户对一组技能中的每一项进行评分,所有技能都是如此 所以,这里我将粘贴模型、视图模型、控制器和视图。最后是关键问题 型号 namespace ClientSkills.Models { public class Client { public int ClientId { get; set; } public string Name { get; set; } pub

好的,看起来应该有人碰到这个,但我没有发现任何有用的东西。这是我的设想

我有一个客户和技能模型。目标是让客户对一组技能中的每一项进行评分,所有技能都是如此

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

型号

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

}
}
查看

此视图通过向导创建一个Create视图,删除它创建的无用字段并将代码放在下面

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

技巧
比率
@foreach(Model.Skills中的var项)
{
@DisplayFor(model=>model.Skills.First(i=>i.SkillName==item.SkillName).SkillName,新的{@class=“control label col-md-2”})
@Html.DropDownListFor(x=>item.SelectedRatingid,new SelectList(item.RatingId,“RatingId”,“Name”),“Seleccione el valor”)
}
问题是在
RateViewModel(Client-Client)
构造函数中的
skillVM.SelectedRatingid=context.Rating.First(r=>r.Name==“No-aplica”).RatingId我为SelectedStatingId属性设置了默认值。我需要确保所有客户都对所有技能进行了评级,即使他们忘记或忽略了其中一项技能

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


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

将所选值传递给SelectList:

@Html.DropDownListFor(x => item.SelectedRatingid, new SelectList(item.Ratings, "RatingId", "Name", item.SelectedRatingid), "Seleccione el valor")
根据我的理解(正确或错误),如果最后一个参数与某个选项值匹配,那么它就是一个对象,否则将选择选项中的第一个参数


更多关于过载的信息。

我不是.net mvc专业人士,如果这是一个愚蠢的评论,我很抱歉。你能为
SelectList
构造函数尝试另一个重载吗:
@Html.DropDownListFor(x=>item.SelectedRatingid,new SelectList(item.Ratings,“RatingId”,“Name”,item.SelectedRatingid),“Seleccione el valor”)
注意
SelectList
的第四个参数,当然,我会尝试并发布成功!!!请把它作为回答来给出你的观点。区别是什么?这是我第一次使用重载,下一个问题是帖子。技能列表为空:(你的意思是在表单提交上?
@Html.DropDownListFor(x => item.SelectedRatingid, new SelectList(item.Ratings, "RatingId", "Name", item.SelectedRatingid), "Seleccione el valor")