如何定义不需要查询字符串的控制器操作?

时间:2012-08-25 19:19:20

标签: asp.net-mvc

以下操作不需要查询字符串,但它确实需要在URL中传递ID。

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

如何更改此名称,以便可以在URL中传递名称而不是ID?

当我将其更改为以下内容时,无论我如何尝试执行它,都会产生错误“Sequence contains no elements”。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

“序列不包含元素” 错误是因为您的LINQ查询未返回此 where子句的任何结果但是您试图在结果集上应用First()函数(在这种情况下,这不适用于您的where条件)。

如果您确定要应用此功能的结果集中有Atleast one元素,请使用First()函数。如果LINQ表达式没有元素,则应用First将引发上述错误。

要使URL具有name参数而不是整数id,只需将参数类型更改为string即可。将变量名称保留为 id 本身。因为这就是MVC路由将用来帮助你编写那些漂亮的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 
}