在这种情况下可以避免重复尝试捕获吗?

时间:2012-03-20 22:55:45

标签: asp.net-mvc-3 razor try-catch

有时,已被引用的用户从数据库中删除数据。在剃须刀中尝试抓住它会很好,但还有另一种方法吗?

现状:该模型包含一个Box列表。每个盒子都有一个容器。保护容器删除以避免错误意味着使用try catch。

无错误处理,

<td>@m.Container.Name</td>

错误处理,

<td>@try{@m.Container.Name}catch { Deleted }</td>

许多列表都有类似的情况,可能会删除关系数据。除了这种尝试捕捉方法之外,还有更好的方法来实现这一目标吗?

一些额外的代码可以帮助您举例:

查看型号:

public class BoxVM
{
 List<Box> Boxes { get; set; }
}

型号:

public class Box
{
 public int BoxId { get; set; }
 public Material Material { get; set; }
 public Container Container { get; set; }
}

public class Material
{
 //fk
 public int BoxId { get; set; }
 public string Description { get; set; }
}

public class Container
{
 //fk
 public int BoxId { get; set; }
 public string Name { get; set; }
}

控制器:

public ActionResult showBoxList()
{
 var vm = new BoxVM();
 vm.boxes = _boxRepo.Get().ToList();
 var materials = _materialRepo.Get().ToList();
 var containers = _containerRepo.Get().ToList();
 foreach(var box in vm.boxes)
 {
  box.Material = materials.Where(m => m.BoxId == box.BoxId).Single();
  box.Container = containers.Where(c => c.BoxId == box.BoxId).Single();
 }
 return View(vm);
}

查看:

@model BoxVM

foreach(var m in Model.boxes)
{
 <p>@m.Container.Name</p> @*// Breaks if specific container was deleted *@
 <p>@try{@m.Container.Name}catch{<text>Deleted</text>}</p> @*// Doesn't break, but is there a better way? *@
}

2 个答案:

答案 0 :(得分:0)

嗯,不知道你的显示要求是什么,但简单的方法是:

foreach(var m in Model.boxes)
{
    if (null != m.Container)
    {
        <p>@m.Container.Name</p>
    }
}
如果你需要显示某些东西,

加上其他部分。你也可以内联。

更多相关内容:

如果这里没有匹配的容器:

box.Container = containers.Where(c => c.BoxId == box.BoxId).Single();

由于Single(),您应该获得例外。当你离开那条线时,box.Container的内容是什么?

答案 1 :(得分:0)

除了这种尝试捕捉方法之外,还有更好的方法来实现这一目标吗?

是。使用支持详细参照完整性策略的方法,允许删除对象图中的单个节点,同时保持对象图的相关性。