繁体   English   中英

c#MVC5 RedirectToAction不起作用-“序列不包含匹配的元素”

[英]c# MVC5 RedirectToAction not working - “Sequence contains no matching element”

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

  • 从表单获取产品模型的列表。
  • 循环浏览并将选定的产品(IsSelected == true)添加到客户模型。
  • 保存更改并通过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();
    }

带有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)循环期间; 产品已正确填充。 但是,当添加到帐户时,列表的计数正确增加,并且PaymentStatus是正确的,但是其余字段为空。
  • 创建一个新的Product()并将产品中的每个属性推入其中都可以得到相同的结果。

有任何想法吗?

在这条线上:

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

您首先需要添加一个条件,以检查ProductsPurchased集合中是否有任何商品的状态为“已售出”。 您可能还需要确保要显示状态为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"})
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM