C#奇怪的行为还是我做错了?

时间:2012-02-22 15:59:56

标签: asp.net-mvc entity-framework c#-4.0 razor asp.net-4.0

任何人都可以解释为什么当“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吗? 请赐教,因为这段代码没有抛出任何异常或警告但只返回零记录......

2 个答案:

答案 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 = ...
}

因此,如果将字符串解析为整数失败,那么它就不会打扰条件语句。