我正在寻找根据另一张桌子从我的桌子中选择一个列表。我需要检索属于特定系统系列的系统名称。我已经添加了外键。我创建了一个包含这两个类的ViewModel,但它抛出了一个空指针异常。我是MVC的新手,我不确定我错在哪里。
模型类:系统 公共类系统 {
public int SystemsID { get; set; }
public string SystemName { get; set; }
public DateTime CreatedOn { get; set;}
public string CreatedBy { get; set; }
public int SystemFamilyID { get; set; }
public virtual SystemFamily SystemFamily { get; set; }
}
Class SystemFamily
public class SystemFamily
{
public int SystemFamilyID { get; set;}
public int SystemsID {get;set;}
public string FamilyName { get; set; }
public DateTime DateCreated { get; set; }
public string CreatedBy { get; set; }
public virtual ICollection<Systems> Systems { get; set; }
}
ViewSystem是我的SystemFamilyController中的一个方法。
public ActionResult ViewSystem(int? id)
{
var viewmodel = new Sys_SysFam();
ViewBag.SystemFamilyID = id.Value;
//if (id != null)
//{
// ViewBag.SystemFamilyID = id.Value;
// viewmodel.Systems = viewmodel.SystemFamily.Where(
// i => i.SystemFamilyID == id.Value).Single().Systems;
//}
return View(viewmodel);
}
观点:
@model SystemFam_System.ViewModel.Sys_SysFam
@{
ViewBag.Title = "ViewSystem";
}
<h2>ViewSystem</h2>
<p>@ViewBag.SystemFamilyID</p>
<table>
@foreach (var item in Model.Systems)
{
string selectedRow = "";
if (item.SystemFamilyID == ViewBag.SystemFamilyID)
{
//{
// selectedRow = "success";
//}
<tr class="@selectedRow">
<td>
@item.SystemName
</td>
<td>
@item.SystemsID
</td>
<td>
@item.SystemFamily
</td>
</tr>
}
}
</table>
我得到空指针Exception。我想在视图系统中查看属于特定系列的系统。
提前致谢!! VINI
编辑:
public class Sys_SysFam
{
public IEnumerable<Systems> Systems { get; set; }
public SystemFamily SystemFamily { get; set; }
}
答案 0 :(得分:1)
好的,我也检查了Sys_SysFam类。根据您当前的代码,它将始终在您使用的控制器代码中抛出空引用异常:
public ActionResult ViewSystem(int? id)
{
var viewmodel = new Sys_SysFam();
ViewBag.SystemFamilyID = id.Value;
//if (id != null)
//{
// ViewBag.SystemFamilyID = id.Value;
// viewmodel.Systems = viewmodel.SystemFamily.Where(
// i => i.SystemFamilyID == id.Value).Single().Systems;
//}
return View(viewmodel);
}
这里,您正在创建Sys_SysFam的对象作为viewmodel,并且您的if部分已被注释,因此您将返回viewmodel.Systems始终为null的相同viewmodel。在这里我没有看到任何数据库从db获取数据的请求,但我认为你的数据在viewmodel中将来自数据库,如果我取消注释你的if条件那么你也没有向数据库发送任何请求你正在使用相同的viewmodel对象创建以上。
viewmodel.Systems = viewmodel.SystemFamily.Where(
i => i.SystemFamilyID == id.Value).Single().Systems;
在右侧,您正在使用viewmodel.SystemFamily和where condition,但是当viewmodel.SystemFamily为null时,它将始终抛出异常。你的解决方案应该是这样的:
public ActionResult ViewSystem(int? id)
{
DataContext context = new DataContext();
var viewmodel = new Sys_SysFam();
ViewBag.SystemFamilyID = id.Value;
if (id != null)
{
ViewBag.SystemFamilyID = id.Value;
var sysFamily = context.SystemFamily.Include(x => x.Systems).FirstOrDefault(x => x.SystemFamilyID == id.Value);
if (sysFamily != null)
{
viewmodel.Systems = sysFamily.Systems;
}
}
return View(viewmodel);
}
这里首先我创建DataContext的对象,这是我使用实体框架访问数据库的主要上下文。所以首先我将基于从数据库传递的id来获得系统系列,如果系统族不是null,那么我将在viewmodel中设置系统的数据。 Include方法将从数据库中为基于系统族的系统带来数据。
同样改进你的Sys_SysFam类来初始化系统,这样当viewmodel.Systems中没有数据时它不会在你的视图中引发异常:
public class Sys_SysFam
{
public Sys_SysFam()
{
this.Systems = new List<Systems>();
}
public SystemFamily SystemFamily { get; set; }
public IEnumerable<Systems> Systems { get; set; }
}
希望这会对你有所帮助。
答案 1 :(得分:0)
select * from table(your_function(parm1, parm2, parm3));
答案 2 :(得分:0)
我的一个朋友可以找到我的方法。但它不使用任何ViewModel。我想知道如何使用ViewModel来完成它。
public ActionResult ViewSystem(int? id)
{
var model = from item in db.Systems
orderby item.SystemsID
where item.SystemFamilyID == id
select item;
return View(model);
}