2012-02-22 9 views
0

「0」を「ページ」パラメータに渡されたときに、このアクションはZERO結果を返し、なぜ誰もが説明できます:私は一時変数がtryparseするために再使用していますのでC#の奇妙な振る舞い、またはそれは私がした間違いですか?

[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 }); 
} 

はそれですか?
このコードは何の例外も注意を払わないので、ゼロレコードを返します。

+4

コードを実行してデバッグしましたか?私はtryparseに関するあなたの質問がコードをステップ実行することで答えられるので、これを尋ねます。 – MrBoJangles

+0

どうやってこれを呼びますか? URLは何ですか? –

+0

なぜTryParseを使用してnullをチェックしていますか? TryParseを使用して、失敗したときにデフォルト値を設定することができます。 – tvanfosson

答えて

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 }); 
} 
+0

あなたのソリューションははるかにクリーンです。大好きです。しかし、それでも奇妙な行動を説明していませんでした。それはバグかtryparseの何か? –

+0

私はtempの値がゼロ以外の何かの上に設定されていると仮定することができますが、ページが空でない文字列の場合はページの解析操作が失敗します。これにより、以前の値に一時的な値が残り、スキップがゼロ以外になります。TryParseを使用する場合は、最初にnullをチェックする必要はなく、解析操作が成功するかどうかをチェックし、そうでない場合は正しいデフォルトを割り当ててください。既存のコードをチェックする1つの方法は、TryParseからParseに変更し、例外がスローされたかどうかを確認することです。それはどこが間違っているのかを教えてくれるでしょう。 – tvanfosson

0

実際にはTryParseを正しく利用せずに、TryParseで一時変数を再利用することになります。パラメータのいずれかが空でない場合は、TryParseが成功したかどうかをさらに制限するために何も問題はありません。

あなたがしなければならないことは、いつでも条件文にTryParseを呼び出すことです。

if(Int32.TryParse(propertyTypeID, out temp)) 
{ 
    props = ... 
} 

することもでき、短絡すぎ初期条件への評価、あなたが必要とするためBOTHそれは非nullまたは空の構文解析に成功することを:だから、それが失敗した場合

if(!String.IsNullOrEmpty(id) && Int32.TryParse(id, out temp)) 
{ 
    props = ... 
} 

文字列を整数に解析する際に、条件文を気にする必要はありません。

+0

私は、tryparseが失敗したことを保証することができます。なぜ文字列 "0"を渡すと失敗するのですか? 私はそれぞれのtryparse文で新しい変数を使用しましたが、現在は動作しています... C#のバグですか? –

+0

"0"のTryParseが失敗したと言っているわけではありません。何らかの理由で、他のIsNullOrEmptyチェックが合格したにもかかわらずTryParseが失敗した場合でも、引き続きフィルタリングを続けると言っています。データが表示されているかどうかを完全に確認するために「スキップ」を試してみましたか?いずれにせよ、あなたはすでに問題を解決したようですので、tvanfossonの提案を答えとしてマークしてください(全体的に最も良い提案だったので)。 TryParseが失敗した場合に一時変数が以前の値を維持するため、彼はこの "バグ"の理由を説明しました。これはバグではありませんが、設計上、事前にtempを設定してください。 – SPFiredrake