1

次のアクションにはクエリ文字列は必要ありませんが、URLでIDを渡す必要があります。

    public ViewResult Details(int id)
    {
        Domain domain = db.Domains.Find(id);
        return View(domain);
    }

IDの代わりに名前をURLで渡すことができるように、これを変更するにはどうすればよいですか?

これを次のように変更すると、実行方法に関係なく、「シーケンスに要素が含まれていません」というエラーが発生します。

    public ViewResult Details(String name)
    {
        Domain domain = db.Domains.Where(d => d.Name == name).First();
        return View(domain);
    }

どんな助けでも大歓迎です。

4

1 に答える 1

3

「シーケンスに要素が含まれていません」エラーは、LINQクエリがこのwhere句First()の結果を返さないが、結果セットに関数を適用しようとして

この関数を適用する結果セットで使用可能な要素が少なくとも1つあることが確実な場合は、First()関数を使用します。LINQ式の結果として要素がない場合、適用するFirstと上記のエラーがスローされます。

URLnameで整数IDの代わりにパラメータを使用するには、パラメータタイプをに変更するだけstringです。変数名はid自体として保持します。これは、MVCRoutingがこれらのきれいなURLを作成するために使用するものだからです。

これで、URLは次のようになります。

../SomeController/Details/someName

アクションメソッドsomeNameのパラメータ値はどこになりますか。Details

を使用してFirstOrDefault、要素がLINQ式に使用できるかどうかを確認します。FirstOrDefaultは、シーケンスの最初の要素を返します。シーケンスに要素が含まれていない場合は、デフォルト値を返します。

public ViewResult Details(String id)
{
    Domain domain = db.Domains.Where(d => d.Name == id).FirstOrDefault();
    if(domain!=null)
       return View(domain);
    else
       return View("NotFound")  //Lets return the Not found View 
}
于 2012-08-25T19:20:58.897 に答える