C# 模型数据未传递到Asp Mvc中的视图

C# 模型数据未传递到Asp Mvc中的视图,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个返回局部视图的动作方法 public PartialViewResult GemByMonth(int id,string btn) { if (btn == "bymnthbtn1") { var birthgembymonth1 = dbcontext.GemStoneByMonths.Where(p => p.GemStoneByMonthId == id).Select(q => new { q.GemEng, q.GemImage });

我有一个返回局部视图的动作方法

public PartialViewResult GemByMonth(int id,string btn)
{
    if (btn == "bymnthbtn1")
    {
     var birthgembymonth1 = dbcontext.GemStoneByMonths.Where(p => p.GemStoneByMonthId == id).Select(q => new { q.GemEng, q.GemImage });
        return PartialView("_BirthGemByMonthEng", birthgembymonth1);
    }

    return PartialView();
}
我的部分观点是

@model Astrology.Models.GemStoneByMonth

<div class="col-md-12">
    <div class="col-md-6" style="height: 100%;margin-top: 12%;font-size: 2em"> @Model.GemEng</div>
    <div class="col-md-6"><img style="height: 7em; margin-left: 7em; margin-top: 3em" src="data:image;base64,@System.Convert.ToBase64String(Model.GemImage)" /></div>
</div>
我有两个按钮。因此,为了区分单击事件发生在哪个按钮,我向我的按钮添加了值,该按钮通过字符串“btn”变量访问


但是我传递给局部视图的模型数据没有传递给我的局部视图。有人能帮我一下吗?

Linq查询在默认情况下是延迟加载的,直到您显式调用ToList、FirstOrDefault、First等等

我相信如果您想得到单个值,您需要使用FirstOrDefault。此外,您需要将模型作为GemStoneByMonth而不是匿名类型传递

public PartialViewResult GemByMonth(int id, string btn)
{
    if (btn == "bymnthbtn1")
    {
        var entity = dbcontext.GemStoneByMonths
            .FirstOrDefault(p => p.GemStoneByMonthId == id);

        var birthgembymonth1 = new GemStoneByMonth
        {
            GemEng = entity.GemEng,
            GemImage = entity.GemImage
        };    
        return PartialView("_BirthGemByMonthEng", birthgembymonth1);
    }
    return PartialView();
}

然后在从整个模型中选择某些值时使用viewdata。您不能在仅选择几个属性的情况下绑定整个模型

var birthgembymonth1 = dbcontext.GemStoneByMonths.FirstOrDefault(p => p.GemStoneByMonthId == id);
ViewBag.GemEng = birthgembymonth1.GemEng;
ViewBag.GemImage = birthgembymonth1.GemImage;
然后在razor视图中,使用以下方法获取这些值:

<div class="col-md-12">
    <div class="col-md-6" style="height: 100%;margin-top: 12%;font-size: 2em"> @ViewBag.GemEng</div>
    <div class="col-md-6"><img style="height: 7em; margin-left: 7em; margin-top: 3em" src="data:image;base64,@System.Convert.ToBase64String(ViewBag.GemImage)" /></div>
</div>

使用select时,c将创建新的动态对象,因此在模型中绑定GemStoneByMonth将不起作用。

尝试在查询末尾添加.Single。现在您正在将IQueryable传递给视图,而不是物化对象。能否共享您的部分视图代码?我已经更新了代码。请检查并使用此选项:var birthgembymonth1=dbcontext.GemStoneByMonths.FirstOrDefaultp=>p.GemStoneByMonthId==id;实际上,您选择的只是图像,而不是完整的模型。因此,您必须绑定图像模型或使用上述代码段。获得异常。其他信息:无法在LINQ to Entities查询中构造实体或复杂类型“Astrology.AstroDatabase.GemStoneByMonth”。我已更新了答案。您现在可以尝试检索GemStoneByMonths单个记录的所有列,并查看它是否解决了问题?是的,它获取值并更新了partialview。但我只想传递一些列值,这就是为什么我使用btn名称来区分。我可以在视图中键入if语句吗?它是否有任何负面影响,如逻辑视图?我想我需要一个视图模型。你可以在视图中添加if语句,除非你有一个非常复杂的业务逻辑。我们通常将复杂的逻辑放在Action方法中,这样我们就可以对逻辑进行单元测试。我知道可以使用viewbag或viewdata来解决这个问题。我认为使用viewbags不是一个好的编码标准,可能会减慢速度。所以我在寻找通过模型传递数据的方法。如果我使用viewbag有什么问题吗?是的,它比模型慢一点。但如果您只想传递2个值,则不需要创建模型,我想:
<div class="col-md-12">
    <div class="col-md-6" style="height: 100%;margin-top: 12%;font-size: 2em"> @ViewBag.GemEng</div>
    <div class="col-md-6"><img style="height: 7em; margin-left: 7em; margin-top: 3em" src="data:image;base64,@System.Convert.ToBase64String(ViewBag.GemImage)" /></div>
</div>