LINQ lambda表达式中的“错误CS0103:名称'w'在当前上下文中不存在”

时间:2019-05-04 11:44:42

标签: c# linq asp.net-core razor asp.net-core-mvc

在一个学校项目中,我在ASP.Net Core中创建了一个待办事项列表,在其中我使用一个局部视图列出所有项,并使用一个局部视图处理“添加新项”表单。一切都通过this之类的AJAX进行“动态”更新。一切正常,因为它在一页中。

该网站包含多个小部件,其中一个是待办事项列表。尝试将待办事项列表添加为仪表板上的小部件时,我们将现有代码放入部分视图中,并将所有小部件加载到较小的拖放框中。

目前看起来不错,但是当我调用特定的控制器动作来创建新项目时,待办事项列表存在问题。 当操作调用此方法时,会发生问题:

public Task<List> FindList(int id)
{
    return GetAllLists().Where(w => w.WidgetId == id).Include(w => w.Widget).FirstAsync();
}

其中的GetAllLists是:

public IQueryable<List> GetAllLists()
{
    return _db.Lists.AsQueryable();
}

小部件的部分视图的内容为:

@using Weplanner_core.Models.Database
@model Weplanner_core.Models.Database.List


@if (Model != null)
{
    if (Model.ListItems == null)
    {
        @:<p>list items == null</p>
    }
    else
    {
        <h2>@Model.Title - @Model.ListType</h2>


        <div id="tableDiv">
            <partial name="~/Views/List/_ListItemsTable.cshtml" for="@Model" />
        </div>

        <div id="listItemCreateFrom" class="newListItemDiv">

            @{
                var newListItem = new ListItem();
            }

            <partial name="~/Views/List/_ListItemCreateForm.cshtml" for="@newListItem" />

            @*@await Html.PartialAsync("~/Views/List/_ListItemCreateForm.cshtml", new ListItem())*@

        </div>

        @*<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>*@
        <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

    }
}
else
{
    @:<p>model is null</p>
}

调试时错误如下: http://prntscr.com/nka673

我尝试使用其他变量制作LINQ表达式,尝试在Controller动作中调用其他DB方法,尝试加载_ListItemCreateForm.cshtml部分视图作为Html.PartialAsync,我尝试复制从原始文件到部分视图的确切代码。我试图将部分视图放在另一个文件夹中,我试图将LINQ方法放在另一个文件中。

当它不起作用时,我在浏览器中收到错误:http://prntscr.com/nk9zy1

我真的看不出错误的原因是什么。有人对如何获得添加新项目的功能有建议吗?

编辑

ListController中控制器动作 ListItemsAjaxCreate 的内容:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ListItemsAjaxCreate(int? id, [Bind("ItemText")] ListItem listItem)
{
    if (id == null)
    {
        return NotFound();
    }
    if (!ModelState.IsValid) return PartialView("_ListItemsTable", await listRepo.FocusedList((int) id));

    var list = await listRepo.FindList((int) id);
    listItem.ListId = (int)id;
    listItem.IsDone = false;
    listItem.CreatedDate = DateTime.Now;
    listItem.List = list;

    var user = db.Users.FirstOrDefault(u => u.Id == GetCurrentUserId());
    if (user != null) listItem.ItemDetails = user.Email;
    try
    {
        listRepo.AddListItem(listItem);
        await db.SaveChangesAsync();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
    return PartialView("_ListItemsTable", await listRepo.FocusedList((int)id));
}

1 个答案:

答案 0 :(得分:0)

在此处操作

我将方法从存储库更改为:

public Task<List> FindList(int id)
{
     return GetAllLists().Include("Widget")
     .Where(w => w.ListId == id)
     .FirstAsync();
}

所以区别在于首先包含,也使用this包含。

我也没有使用正确的ID来路由到正确的组,但是在使用链接的包含之前,我发现了这一点。我不知道为什么使用此版本会有所作为。

这个建议实际上是在我发布帖子后几分钟内有人提出的,但由于我想回复,因此删除了该帖子。