问题 如何通过ViewModels进行学习?

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
如何在.NET MVC的ViewModels上使用ForEach循环?

我有2个型号:

公园模型:
C#:
public class Park
    {
        [Key]
        public int ParkId { get; set; }
        public string ParkName { get; set; }
        public string ParkState { get; set; }
        public string ParkLatitude { get; set; }
        public string ParkLongitude { get; set; }
    }

还有一个HikingTrail模型:
C#:
public class HikingTrail
    {
        [Key]
        public int TrailId { get; set; }
        public string TrailName { get; set; }
        public string TrailDifficulty { get; set; }
        public string TrailSummary { get; set; }
        public double TrailLength { get; set; }
}

我想使用ViewModel来访问这两个模型中的数据。无论我以哪种方式设置ViewModel,都会出现错误。
C#:
    public class ParkTrailViewModel
    {
        [Key]
        public int ParkTrailId { get; set; }

        [ForeignKey("Park")]
        public int ParkId { get; set; }
        public Park Park { get; set; }

        [ForeignKey("HikingTrail")]
        public int TrailId { get; set; }
        public HikingTrail HikingTrail { get; set; }
    }

这段代码给了我以下错误:
The model item passed into the ViewDataDictionary is of type 'walkinthepark.Models.Park', but this ViewDataDictionary instance requires a model item of type 'walkinthepark.Models.ParkTrailViewModel'.

我只想在“详细信息”视图上遍历每个HikingTrail,该视图使用ParkTrailViewModel
C#:
@foreach (var item in Model.HikingTrail)
        {

        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.TrailName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TrailDifficulty)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TrailLength)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TrailCondition)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TrailSummary)
            </td>
        </tr>
        }

我也曾经见过这个错误,我只是不记得我是怎么得到的。
CS1579 C# foreach statement cannot operate on variables of type because does not contain a public instance definition for 'GetEnumerator'
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
您不会遍历单个对象。那没有道理。您遍历对象列表,因此遍历的对象必须是某种列表。你说你想 "遍历每个HikingTrail" 但只有一个 爬山径。看你的代码;这就是它的意思:
C#:
public HikingTrail HikingTrail { get; set; }
这就像在说 "我手里有一个鸡蛋,我想把纸箱里的每个鸡蛋都弄碎".

我怀疑您的设计一直到数据库都是错误的。看来您有一个 公园 与表 公园Id 作为主键, 爬山径 与表 远足TrailId 作为主键和一个 公园步道 与表 公园步道Id 作为主键和 公园Id远足TrailId 作为外键。错了这意味着您在公园和远足小径之间有着多对多的关系。这意味着一个公园可能包含许多远足径,而一条远足径可能在许多公园中。除非您的步道很长并且跨越多个公园,否则这没有任何意义。我认为这应该是一对多的关系,在这种情况下,您将摆脱 公园步道 表并添加 公园Id到远足小径 表作为外键。

在这种情况下,您的视图模型将没有 公园步道Id and ParkId 将是主键。代替这个:
C#:
[ForeignKey("HikingTrail")]
public int TrailId { get; set; }
public HikingTrail HikingTrail { get; set; }
您将具有以下内容:
C#:
public IEnumerable<HikingTrail> HikingTrails { get; set; }
现在,您实际上已经获得了多个 爬山径 对象循环。
 

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
你是对的,我只是错了。
我最终在ParkController的Details Task中添加了一些内容<ActionResult>而且有效。我什至没有使用ViewModel。
park.HikingTrail = _context.HikingTrails.Where(i => i.ParkId == id).ToList();

您说的是提醒您坐下来看看基本原理。我当时正处于无法工作并且尝试一切的地步。那时所有的原则都没有了。

I didn't try your public IEnumerable<HikingTrail> HikingTrails { get; set; }, but I think I will give that a shot on another part of this project.
谢谢你。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
请注意,任何成员名称都应指明其代表的含义。如果您打算将成员存储在一个列表中,则此处不应有单数名称通知:
C#:
park.HikingTrail = _context.HikingTrails.Where(i => i.ParkId == id).ToList();
正是由于这个原因,右边的属性是复数形式,而您的财产错误地是单数形式。
 

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
请注意,任何成员名称都应指明其代表的含义。如果您打算将成员存储在一个列表中,则此处不应有单数名称通知:
C#:
park.HikingTrail = _context.HikingTrails.Where(i => i.ParkId == id).ToList();
正是由于这个原因,右边的属性是复数形式,而您的财产错误地是单数形式。



应该这样吗?
C#:
parks.HikingTrails = _context.HikingTrails.Where(i => i.ParkId  == id).ToList();
 
最佳 底部