Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建ViewBag显示类的属性?_C#_Asp.net_.net_Asp.net Core Mvc_Dapper - Fatal编程技术网

C# 如何创建ViewBag显示类的属性?

C# 如何创建ViewBag显示类的属性?,c#,asp.net,.net,asp.net-core-mvc,dapper,C#,Asp.net,.net,Asp.net Core Mvc,Dapper,我有两个模型忍者和道场 他们是一对多的关系。忍者属于一个道场,而道场可以有很多忍者 我用的是整洁的 忍者 using System.ComponentModel.DataAnnotations; using dojoleague.Models; using System; namespace dojoleague.Models { public class Ninja : BaseEntity{ [Key] public long Id {get; set;} [R

我有两个模型忍者和道场

他们是一对多的关系。忍者属于一个道场,而道场可以有很多忍者

我用的是整洁的

忍者

using System.ComponentModel.DataAnnotations;
using dojoleague.Models;
using System;

namespace dojoleague.Models {
public class Ninja : BaseEntity{

    [Key]
    public long Id {get; set;}

    [Required(ErrorMessage="You need a name!")]
    public string Name {get; set;}

    [Range(1,11, ErrorMessage="Must be between 1 and 10")]
    public int Level {get; set;}

    [Required]
    public Dojo Dojo {get; set;}

    public string Description {get; set;}


  }
}
Ninja工厂:

public IEnumerable<Ninja> FindAll() 
{ 
    using (IDbConnection dbConnection = Connection) 
    { 
        dbConnection.Open(); 
        return dbConnection.Query<Ninja>("SELECT * FROM ninjas"); 
    } 
} 
现在,System.Console.writelinewninja.Dojo.Name在控制台中正确地打印出Dojo的名称

但是,它不会在我的web浏览器上显示Dojo的名称

在我的cshtml中

@{
  foreach(var ninja in ViewBag.Ninja){
      <h2>@ninja.Name</h2>
      <h4>@ninja.Dojo.Name</h4>
   }
 }
它会打印@ninja.Name,但不会打印@ninja.Dojo.Name

RuntimeBinderException:无法对空引用执行运行时绑定

如何使用ViewBag显示属于忍者类的Dojo类的属性

提前非常感谢。

根据,您似乎需要将查询更新为: 变量sql= @从忍者n中选择* d上的左连接Dojo d。Id=n.DojoId 按n.Id订购


return dbConnection.Querysql,ninja,dojo=>{ninja.dojo=dojo;return ninja;}

此代码有几个问题。道场没有上膛,没有道场/大师,你无法对付浪人、忍者/武士

正如@peinearydevelopment所解释的,Dapper不会像功能齐全的ORMs那样自动加载相关对象。您必须在一行中返回这两个对象,例如使用联接并将不同字段映射到不同的对象

你可以写:

var sql ="SELECT * FROM ninjas inner join Dojos on Ninjas.DojoID=Docos.ID";
dbConnection.Query<Ninja, Dojo, Ninja>(sql, (ninja, dojo) => 
    { 
        ninja.Dojo = dojo; 
        return ninja;
    });
在这种情况下,您必须更改MVC视图循环以忽略空值。您可以检查Dojo并完全删除标头,或者呈现不同的代码段:

@foreach(var ninja in Model.Ninja)
{
    <h2>@ninja.Name</h2>
    @if (ninja.Dojo != null)
    {       
       <h4>@(ninja?.Dojo?.Name)??"Ronin!"</h4>
    }
}
或作为ViewModel类的一部分:

 var ninjas= ninjaFactory.FindAll();
 var villains = ...;
 var game = new GameModel { Ninjas = ninjas, Villains = villains};
 return View(game);

//View
@model GameModel


@foreach(var ninja in Model.Ninjas)

你能编写你的ninjaFactory.FindAll方法吗?public IEnumerable FindAll{使用IDbConnection dbConnection=Connection{dbConnection.Open;return dbConnection.QuerySELECT*FROM ninjas;}}}这与MVC或viewbag无关。错误消息解释了问题所在。Dojo属性至少为null。有道场可以展示吗?数据是什么样子的?如果不使用ViewBag,调试此问题会容易得多。返回忍者作为模型,即var ninjas=ninjaFactory.FindAll;返回视图忍者;。医生说你还需要把道具放在一个盒子里join@PanagiotisKanavos是的,我忘了包含实际的sql查询。更新,谢谢!
var sql ="SELECT * FROM ninjasWithDojos ...";
dbConnection.Query<Ninja, Dojo, Ninja>(sql, (ninja, dojo) => 
    { 
        ninja.Dojo = dojo; 
        return ninja;
    });
var sql ="SELECT * FROM ninjas left outer join Dojos on Ninjas.DojoID=Docos.ID";
@foreach(var ninja in Model.Ninja)
{
    <h2>@ninja.Name</h2>
    @if (ninja.Dojo != null)
    {       
       <h4>@(ninja?.Dojo?.Name)??"Ronin!"</h4>
    }
}
//Controller
 var ninjas= ninjaFactory.FindAll();
 return View(ninjas);

//View
@model IEnumerable<Ninja>


@foreach(var ninja in Model)
 var ninjas= ninjaFactory.FindAll();
 var villains = ...;
 var game = new GameModel { Ninjas = ninjas, Villains = villains};
 return View(game);

//View
@model GameModel


@foreach(var ninja in Model.Ninjas)