首页 > 解决方案 > 处理 Next Record 可空引用控制器代码以传递给 viewbag

问题描述

我研究了各种可为空的引用处理帖子,但没有发现任何有用的东西。因此,我在下面处理这个空引用(现在阻止向用户显示错误页面是一种技巧)实际上是在我的编辑控制器中不存在下一条记录时返回当前 id。

public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var myInClause = new string[] { "a", "c", "k" };
    var myQueryResults = await _context.MyClass.FindAsync(id);
    int?  NextIdObject = (from i in _context.MyClass
                        where myInClause.Contains(i.RowType) && (i.Id > myclass.Id) 
                        select new { i.Id }).DefaultIfEmpty().First().Id;
    if (!NextIdObject.Equals(0))
    {
        ViewBag.nextID = NextIdObject; 
    }
    else
    {  
        ViewBag.nextID = id;
    }

    if (myQueryResults == null)
    {
        return NotFound();
    }
    return View(myQueryResults);
}

我宁愿只重定向到索引页面(如果他们遇到这个错误,这意味着他们已经完成了一个队列的工作,这里永远不会存在下一条记录)。或者也许只是保持代码原样并在按钮上显示一条消息以指示列表结束。这里有任何想法。请注意,在 id 上使用任何 +1 增量对我不起作用,因为我不需要用户查看所有 id 记录,只需要带有 a/c/k 的记录,这就是我引入 myInclause 变量的原因。如果有一种更好的方法可以将“IN”的 SQL sytanx 用于 Linq 查询,我全神贯注。

标签: asp.net-mvclinqasp.net-core

解决方案


我宁愿只重定向到索引页面(如果他们遇到这个错误,这意味着他们已经完成了一个队列的工作,这里永远不会存在下一条记录)

你可以简单地使用 try...catch 块

try
{
     var myInClause = new string[] { "a", "c", "k" };
     var myQueryResults = await _context.MyClass.FindAsync(id);
     int  NextIdObject = (from i in _context.MyClass
                    where myInClause.Contains(i.RowType) && (i.Id > myclass.Id) 
                    select new { i.Id }).DefaultIfEmpty().First().Id;
     ViewBag.nextID = NextIdObject; 
}
catch(Exception ex)
{
     return RedirectToAction("Index");
     //or return View("Index");
}
return View(myQueryResults);

推荐阅读