为了查看其他人的详细信息,我尝试使用以下方法来阻止人们更改querystring:
public static bool IsCurrentUserAuthorisedVessel(HttpRequest request)
{
Guid currentUser = GetCurrentUserId();
PersonRepository repo = new PersonRepository();
VesselRepository vesselRepo = new VesselRepository();
Person currentPerson = repo.GetPersonByUser(currentUser);
int qs = int.Parse(request.QueryString["VesselId"]);
Vessel currentVessel = vesselRepo.GetVessel(qs);
if (!String.IsNullOrEmpty(request.QueryString["VesselId"]))
{
if (IsCurrentUserAdmin())
{
return true; //Always return true for admin
}
else
{
if (currentPerson.Vessels.Contains(currentVessel))
{
return true;
}
else
return false;
}
}
return true;
}在这个示例中,我目前正在调试currentPerson.Vessels在一个Icollection<Vessel>中生成3个容器,其中一个容器的VesselId值为6,也恰好是currentVessel的VesselId,但是匹配失败了,方法正在返回false。
我已经对类似的问题和MSDN文档做了一些阅读,我对这里发生的事情的理解是因为在ICollection中ID为6的容器是我试图匹配的currentVessel的不同实例,引用导致不相等,并且与平等规则有关的事情不是基于ID的。
我的Person模型包含public virtual ICollection<Vessel> Vessels { get; set; },这是否意味着我必须在public virtual ICollection<Vessel> Vessels { get; set; }模型上实现IEquatable接口,然后重写IEquatable方法。
在这种情况下,我想要基于id的自己的自定义规则。如何重写此方法?
发布于 2014-11-04 14:34:05
在这种情况下重写Equals似乎有点过分,为什么不直接这么做呢?
currentPerson.Vessels.Any(x => x.ID == currentVessel.ID)发布于 2014-11-04 14:41:36
“james”建议的解决方案不是最佳实践。在这里,如果您有一个应该添加到Hashset<Vessel>中的容器的长列表,那么因为它将在GetHashCode上索引,而.Any是一种扩展方法,应该遍历所有元素来找到正确的元素,而代价将是O(n)。
你可以做这样的事
public class Vessel : IEquatable<Vessel>
{
public int Id { get; set; }
public bool Equals(Vessel other)
{
return Id == other.Id ;
}
public override int GetHashCode()
{
return Id;
}
public override bool Equals(object obj)
{
var vessel = obj as Vessel;
return vessel != null && vessel.Id == this.Id;
}
}更新
我之所以说这不是最好的实践,是因为OP说他有一个ICollection<Vessel>,可以转换成许多泛型集合,比如List<T>。
来自MSDN
当调用许多泛型集合对象的搜索方法时。其中一些类型及其方法包括:
发布于 2014-11-04 14:40:51
变化
if (currentPerson.Vessels.Contains(currentVessel))
{
return true;
}
else
return false;至
return currentPerson.Vessels.Any(x => x.ID == currentVessel.ID)https://stackoverflow.com/questions/26737633
复制相似问题