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)