【问题标题】:Load one-to-many model加载一对多模型
【发布时间】:2017-05-11 07:57:29
【问题描述】:

我有这样的模型:

public partial class Goods
{
    public decimal good_id { get; set; }
    public string good_name { get; set; }
    public virtual ICollection<Description> description { get; set; }
}

public partial class Description
{
    public decimal des_id { get; set; }
    public decimal des_good_id { get; set; }
    public string des_name { get; set; }
    public string des_value { get; set; }
    public virtual Goods goods { get; set; }
}

如何从商品中的每个商品的视图中加载与商品具有相同 ID 的描述模型中的所有数据?

我的控制者:

public ActionResult Index()
{
    var parts = _db.Goods.Include(p => p.Details);
    return View(parts.ToList());
}

这东西不行:

@foreach (var part in Model)
{
    <div class="well">
        <div class="row">
            <div class="col-xs-10">
                <h3>
                    <strong>@part.good_name</strong>
                </h3>
                <h4>
                    <strong>@part.Description</strong>
                </h4>
            </div>
        </div>
    </div>
}

【问题讨论】:

  • 您的问题是关于从数据库中检索数据,但您没有显示检索此数据的代码。您可以添加该代码吗?这将是找到问题的关键。

标签: c# asp.net .net asp.net-mvc entity-framework


【解决方案1】:

我能理解你的问题,你有模型,你的模型中也有一个列表,你想用列表检索数据

这是你的控制器代码

public ActionResult Index()
{
    var parts = _db.Goods.Include("Descriptions").Where(x=>x.good_id == id);
    return View(parts));
}

其中“id”是基于您的数据将被找到的 id

这是您使用 razor 引擎查看代码

 @import YourApplicationName.Model.Goods
 @foreach (var part in @Model.Description)
 {
 <div class="well">
    <div class="row">
        <div class="col-xs-10">
            <h3>
                <strong>@part.des_name</strong>
            </h3>
            <h4>
                <strong>@part.des_value</strong>
            </h4>
        </div>
    </div>
</div>
}

希望这是你的答案

【讨论】:

    【解决方案2】:

    首先在控制器中 -> 动作生成数据并将其传递给模型:

    public ActionResult SampleAction()
    {
        using(var context = new YourContext())
        {
            return View(context.Goods.Include("description").First()); // for example    
        }          
    }
    

    之后你必须在 View 中定义你的模型并将它放在视图的第一行:

    @model Goods
    

    那么您就拥有了所需的一切: 只需渲染您的数据:

    <table>
        <tr>
            <td colspan="2">
                @Model.good_name 
            </td>
        </tr>
    @foreach (descp in @Model.description.ToList())
    {
        <tr>
            <td>
                @desc.des_name
            </td>
            <td>
                @desc.des_value
            </td>
        </tr>
    }
    </table>
    

    【讨论】:

    • 效果很好,谢谢!但现在我有一个问题 - 如何不仅加载 .First() ?我正在尝试……但没有。
    • 将context.Goods.Include("description").First()改为context.Goods.Include("description").ToList(),你会得到所有的数据并改变@模型 Goods 到 @model List 等等。
    • 实际上,我在@model List 之后被卡住了,不知道下一步该做什么。我用字段 public List goods {get; set;} 但这没有帮助。
    • 之后,您在 @Model 中有一个商品列表,您可以对其进行迭代。 @foreach(@Model 中的 var g){ ... } 在 cshtml 中。
    • 但这仅适用于商品。现在在 html 中我可以这样做:@foreach(var good in @Model) { @good.good_name } 。请您向我解释一下,如何以这种方式获取详细信息?
    【解决方案3】:

    如果您使用的是实体框架,它会自动为每个商品加载相关的描述。您不必为此专门做任何事情。你可以简单地使用goodsInstance.Description

    【讨论】:

    • 请检查我在主帖中的编辑。我试过你说的,但它不起作用。我做错了什么?
    • 您正在直接尝试打印作为集合的描述属性。您必须遍历由“描述”表示的集合。
    • 但是由于视图是强类型的,所以无法请求到@Model.Description
    • 您应该能够循环描述,如另一个答案所示。
    猜你喜欢
    • 2014-10-29
    • 2023-03-18
    • 2020-05-16
    • 2019-09-15
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多