簡體   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