属性的值未显示在视图中

Attribute's value not shown in View

我正在开发 ASP.NET MVC 项目,该项目使用 XML 文件作为数据源。我在显示虚拟 属性 的属性时遇到问题。

首先,我有3个模型classes

玩家:

public class Player
{
    [Required]
    public String clubName { get; set; }
    [Required]
    public String id { get; set; }
    [Required]
    public int number { get; set; }
    [Required]
    public String name { get; set; }
    [Required]
    public String position { get; set; }
    [Required]
    public DateTime dateOfBirth { get; set; }
    [Required]
    public string placeOfBirth { get; set; }
    [Required]
    public double weight { get; set; }
    [Required]
    public double height { get; set; }
    [Required]
    public String description { get; set; }
    [Required]
    public String imageLink { get; set; }
    [Required]
    public Boolean status { get; set; }

    public virtual ICollection<PlayerAchievement> achievements { get; set; }
}

成就

public class Achievement
{
    [Key]
    public String name { get; set; }

    [Required]
    public String imageLink { get; set; }

    public virtual ICollection<PlayerAchievement> playerAchievements { get; set; }

    public Achievement()
    {
        this.name = null;
        this.imageLink = null;
    }

    public Achievement(String name, String imageLink)
    {
        this.name = name;
        this.imageLink = imageLink;
    }
}

和Player_Achievement class:

public class PlayerAchievement
{
    [Key]
    public String playerId { get; set; }

    [Required]
    public String achievementName { get; set; }

    [Required]
    public int number { get; set; }

    public virtual Player player { get; set; }

    public virtual Achievement achievement { get; set; }

    public PlayerAchievement()
    {
        this.playerId = null;
        this.achievementName = null;
        this.number = 0;

    }

    public PlayerAchievement(int number, String playerId, String achievementName)
    {
        this.playerId = playerId;
        this.achievementName = achievementName;
        this.number = number;
    }
}

我也有这 3 个 classes 的存储库,下面是 PlayerAchievement 的存储库:

public class PlayerAchievementRepository : IPlayerAchievementRepository
{
    public List<PlayerAchievement> allPlayerAchievements;
    private XDocument playerAchievementData;

    public PlayerAchievementRepository()
    {
        //Code get all player_achievement in xml file
    }

    public IEnumerable<PlayerAchievement> GetPlayerAchievementsByPlayerID(String id)
    {
        return allPlayerAchievements.FindAll(item => item.playerId.Equals(id));
    }
}

现在。我想查看玩家的成就列表。所以在 PlayerAchievementsController 的 Index 动作中,我写了这段代码:

public ActionResult Index(String id)
{
    return View(_repository.GetPlayerAchievementsByPlayerID(id));
}

但是,Index 视图仅显示 PlayerAchievement 的数量以及图像 link 和名称的空值。不知道为什么能取到1个属性的值,其他的就取不到。

索引视图部分代码:

<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.achievement.imageLink)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.number)
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.achievement.imageLink)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.number)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.playerId }) |
        @Html.ActionLink("Details", "Details", new { id=item.playerId }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.playerId })
    </td>
</tr>

看看我在 GitHub 上的项目:https://github.com/quyetnv8893/PlayerManagement

我从 git hub 得到了你的代码的副本,有一点点变化,请将 AchievementRepository.cs 第 39 行的代码更改为

achievementData.Descendants("achievements").FirstOrDefault().Add(new XElement("achievement",
                new XElement("name", achievement.name), new XElement("imageLink", achievement.imageLink)));

因为您之前的代码正在创建无效的 xml 标签层次结构。

问题解决:我没有读取PlayerAchievement的相关数据,所以PlayerAchievement中的Achievement属性目前为空。为解决此问题,已在 PlayerAchievement

的 Index 操作中更新此代码
public ActionResult Index(String id)
{   
    private IAchievementRepository _achievementRepository = new AchievementRepository();         
    var playerAchievements = _repository.GetPlayerAchievementsByPlayerID(id)
            .Where(achievement => achievement.PlayerID.Equals(id));
    foreach (var achievement in playerAchievements)
    {
        achievement.Achievement = _achievementRepository.GetAchievementByName(achievement.AchievementName);
    }
    return View(playerAchievements.ToList());
}

和使用dbContext.Include()

一样