首页 > 解决方案 > C# MVC 动作结果

问题描述

我正在学习 ASP.MVC 并坚持一个问题,不知道这是否是解决问题的方法。

我有一个具有以下操作结果的控制器:

[Route("customers/show/{id}")]
public ActionResult Show(int id)
{
    var customer = GetCustomers().SingleOrDefault(c => c.Id == id);
    return View(customer);
}

问题是只要整数作为参数发送就没有问题。例如“/customers/show/123”,但如果有人尝试像这样访问“/customers/show/12xyz”,那么它会抛出一个像这样的丑陋错误:

Server Error in '/' Application.
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Show(Int32)' in 'MyApp.Controllers.CustomersController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

我想避免该应用程序错误,所以我尝试像这样解决。这是正确的 MVC 方式还是有其他更聪明的方式?

[Route("customers/show/{id}")]
public ActionResult Show(string id)
{
    int custId = 0;
    int.TryParse(id, out custId);

    var customer = GetCustomers().SingleOrDefault(c => c.Id == custId);
    return View(customer);
}

标签: c#asp.net-mvc

解决方案


[Route("customers/show/{id}")]
public ActionResult Show(int? id)
{
    var customer = GetCustomers().SingleOrDefault(c => c.Id == id);
    if (customer == null)
    {
        return HttpNotFound();
    }
    return View(customer);
}

这样,如果数据库/文件/无论您在哪里搜索该 ID,都没有任何内容,您会向客户返回一个结果,让他们知道这一点;在这种情况下,HTTP 错误 404:未找到。


推荐阅读