2014-09-15 7 views
0

나는 다음을 수행하는 컨트롤러 액션이 "순서가 일치하는 요소를 포함하지 않는다"C#을 MVC5 RedirectToAction가 작동하지 않습니다 -

  • 양식에서 제품 모델의 목록을 취합니다.
  • 선택한 제품을 순환 게재하고 (IsSelected == true) 계정 모델에 추가합니다.
  • 변경 사항을 저장하고 AccountID를 전달하여 다른 작업으로 리디렉션합니다.
  • ID가 올바르게 수신되면 올바른 계정을 찾아보기로 전달합니다.
  • 그러면보기가 계정을 구문 분석하고 위의 계정에 추가 된 제품 목록을 표시합니다.

그러나 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(); 
    } 
, 계정 ID를 취 계정을 찾아 모델로보기에 전달

제품 컨트롤러 :

[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에 제품) 루프 동안

  • ; 제품이 올바르게 채워집니다. 그러나 계정에 추가하면 목록의 개수가 올바르게 증가하고 PaymentStatus는 정확하지만 나머지 필드는 null입니다.
  • 새 제품()을 만들고 제품의 각 속성을 밀어 넣으면 동일한 결과가 나타납니다.

아이디어가 있으십니까?

답변

2

를 시도 :

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

먼저 판매의 상태를 가지고있는 ProductsPurchased 컬렉션에서 모든 항목이 있는지 여부를 확인하는 조건을 추가해야합니다. 또는 컨트롤러 코드에서 제시 한대로 상태가 이고 보류 중 인 제품을 표시하고자 할 수도 있습니다.

그래서, 기본적으로

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"}) 
} 
+0

똑똑한, 그 트릭을! Juann에게 감사드립니다. – Dezzamondo

0

나는 그 수정에 대해 확신하지 못했지만, 귀하가 acc가 돌아 오길 기다리는 것이 아니라, 더 정확하게 이것을 반환 할 때까지 기다리는 것이 아니라고 생각합니다.

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

비동기를 사용하고 있기 때문에 결과를 사용하기 전에 await을 사용해야합니다. 는이 라인에 살려

+1

아니, 비동기 방법에 .Result을하는 것은 동 기적으로 발생합니다. –

+0

아, 그 정도면 충분합니다. – Pheonyx

관련 문제