任何人都可以解释为什么当“0”传递给“page”参数时此操作会返回ZERO结果:
[HttpPost]
public ActionResult SearchProperties(string id, string offerTypeID, string propertyTypeID, string page)
{
int temp = 0;
var props = from s in db.Properties
where s.Approved && s.Available
select s;
if (!String.IsNullOrEmpty(id))
{
Int32.TryParse(id, out temp);
props = from s in props
where s.PropertyType.PropertyTypeCategoryID == temp
select s;
}
if (!String.IsNullOrEmpty(offerTypeID))
{
Int32.TryParse(offerTypeID, out temp);
props = from s in props
where s.OfferTypeID == temp
select s;
}
if (!String.IsNullOrEmpty(propertyTypeID))
{
Int32.TryParse(propertyTypeID, out temp);
props = from s in props
where s.PropertyTypeID == temp
select s;
}
props = props.OrderBy(s => s.PropertyID);
int i = 0, skip = 0;
if (!String.IsNullOrEmpty(page))
{
Int32.TryParse(page, out temp);
skip = temp * 10;
}
else
{
skip = 0;
}
props = props.Skip(skip).Take(10);
var marks = (from s in props.ToList()
select s);
return Json(new { markers = marks });
}
是因为我正在重新使用temp变量来进行tryparse吗? 请赐教,因为这段代码没有抛出任何异常或警告但只返回零记录......
答案 0 :(得分:3)
您的代码需要更复杂。简化它应该会产生正确的结果,或者至少使调试更容易。让框架为您转换为int
。如果不需要这些参数,请将它们置为可空。
[HttpPost]
public ActionResult SearchProperties(int? id, int? offerTypeID, int? propertyTypeID, int? page)
{
var props = from s in db.Properties
where s.Approved && s.Available
select s;
if (id.HasValue)
{
props = from s in props
where s.PropertyType.PropertyTypeCategoryID == id.Value
select s;
}
if (offerTypeID.HasValue)
{
props = from s in props
where s.OfferTypeID == offerTypeID.Value
select s;
}
if (propertyTypeID.HasValue)
{
props = from s in props
where s.PropertyTypeID == propertyTypeID.Value
select s;
}
props = props.OrderBy(s => s.PropertyID);
// use null coalescing operator to default to 0
page = page ?? 0;
int skip = page * 10;
props = props.Skip(skip).Take(10);
var marks = (from s in props.ToList()
select s);
return Json(new { markers = marks });
}
答案 1 :(得分:0)
很可能它与在TryParse中重用temp变量有关,而没有正确使用TryParse。如果任何参数都是非null,非空,那么无论它是什么,它仍会尝试进一步限制你的道具查询TryParse是否成功。
您应该做的是在任何时候调用条件语句时使用TryParse。
if(Int32.TryParse(propertyTypeID, out temp))
{
props = ...
}
您也可以将评估短路到初始条件中,因为您要求它非空或空并且在解析时成功:
if(!String.IsNullOrEmpty(id) && Int32.TryParse(id, out temp))
{
props = ...
}
因此,如果将字符串解析为整数失败,那么它就不会打扰条件语句。