【问题标题】:c# MVC5 RedirectToAction not working - "Sequence contains no matching element"c#MVC5 RedirectToAction 不工作 - “序列不包含匹配元素”
【发布时间】:2014-11-09 00:16:36
【问题描述】:

我有一个执行以下操作的控制器操作:

  • 从表单中获取产品型号列表。
  • 循环选择产品 (IsSelected == true) 并将其添加到 Account 模型。
  • 保存更改并重定向到另一个操作,传递 AccountID。
  • ID 被正确接收,找到正确的帐户并将其传递给 View。
  • 然后视图解析帐户并显示添加到上述帐户的产品列表。

但是,MVC 不断抛出错误“序列不包含匹配元素”,我正在努力找出原因。

获取产品列表并将其添加到用户帐户的帐户控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> AddProduct(List<Product> products)
    {
        //var acc = FetchCurrentUserAccount();
        if (db.Accounts != null)
        {
            var acc = db.Accounts.Find(UserManager.FindByIdAsync(User.Identity.GetUserId()).Result.Account.AccountID);
            foreach (var product in products)
            {
                if (product.IsSelected)
                {
                    product.PaymentStatus = enPaymentStatus.Pending
                    acc.ProductsPurchased.Add(product);
                }
            }
            await db.SaveChangesAsync();

            return RedirectToAction("Pay", "Products", new {id = acc.AccountID} );
        }
        return HttpNotFound();
    }

Product Controller 获取一个 AccountID,找到该帐户并将其作为模型传递给 View:

    [HttpGet]
    public ActionResult Pay(int? id)
    {
        var acc = db.Accounts.Find(id);
        return View(acc);
    }

视图本身:

@using PPPv2.Models
@model Account
@{ var subtotal = 0.0d;}
<h2>Payment:</h2>

@if (Model != null)
{
<h4>Thank you @Model.Salutation @Model.LastName</h4>
<h4>Please check that the product(s) and amounts below are correct before completing your purchase.</h4>


    foreach (var item in Model.ProductsPurchased)
    {

        <div>
            @Html.DisplayFor(modelItem => item.Name)
            <div>
                @Html.DisplayFor(modelItem => item.Price)
                @{ subtotal += item.Price; }
            </div>
        </div>
    }

    <div>
        Total to pay:
        <div>
            @Html.Display(String.Format("£{0:#,###0.00}", subtotal))
        </div>
    </div>

    @Html.ActionLink("Pay", "Process", "Products", new {id = Model.ProductsPurchased.First(x => x.PaymentStatus == enPaymentStatus.Sold)}, new {@class = "btn btn-warning"})
}
else
{
    <div>
        No products were found in your cart... Odd...
        <div>
            @Html.ActionLink("Select a product", "AddProduct", "Account", null, new {@class = "btn btn-warning"})
        </div>
    </div>
}

注意事项:

  • 在帐户控制器中的 foreach(var product in Products) 循环期间;产品已正确填充。然而,当添加到帐户时,列表的 Count 正确增加并且 PaymentStatus 正确,但其余字段为空。
  • 创建一个新的 Product() 并将每个单独的属性从 product 推入它会产生相同的结果。

有什么想法吗?

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-5


    【解决方案1】:

    在这一行:

    @Html.ActionLink("Pay", "Process", "Products", 
    new {id = Model.ProductsPurchased.First(x => x.PaymentStatus == enPaymentStatus.Sold)},
     new {@class = "btn btn-warning"})
    

    您需要先添加一个条件,检查 ProductsPurchased 集合中是否有任何状态为 Sold 的项目。您可能还需要确保您希望显示状态为 Sold 的产品,或者更确切地说,如您的控制器代码所示,状态为 Pending 的产品。

    所以,基本上

    if(Model.ProductsPurchased.Any(x => x.PaymentStatus == enPaymentStatus.Sold/*or Pending?*/)){
    @Html.ActionLink("Pay", "Process", "Products", 
        new {id = Model.ProductsPurchased.First(x => x.PaymentStatus == enPaymentStatus.Sold/*or Pending?*/)},
         new {@class = "btn btn-warning"})
    }
    

    【讨论】:

      【解决方案2】:

      我不确定修复方法,但我相信您并没有等待 acc 返回,更准确地说是等待返回。

      UserManager.FindByIdAsync(User.Identity.GetUserId()).Result.Account.AccountID
      

      因为您使用的是异步,所以我希望您在尝试使用结果之前使用 await。 你试过吗

      【讨论】:

      • 不,对异步方法执行 .Result 会使其同步触发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多