在MVC4中使用RedirectToAction发送列表

时间:2014-12-29 06:30:40

标签: asp.net-mvc-4

我有以下代码

        public ActionResult Item_Post()
    {
        List<Product> products=new List<Product>() ;
        int? total=0;
       HttpCookie cookie= Request.Cookies["myvalue"];
       if (Request.Cookies["myvalue"] != null)
       {
           int count = Request.Cookies["myvalue"].Values.Count;
               var s = Request.Cookies["myvalue"].Value;
               s = HttpUtility.UrlDecode(s ?? string.Empty);
               string[] values = s.Split(',').Select(x => x.Trim()).ToArray();                      
               for (int i = 1; i < values.Length; i++)
               {
                   int id = Convert.ToInt32(values[i]);
                   Product product = db.Products.Single(x => x.Id == id);                       
                   total+=product.Price;
                   products.Add(product);
               }
               ViewBag.total = total;     
           TempData["products"]=products;   
       }
       Session["prod"] = products;
       return View("Buy", products);
       //return RedirectToAction("Buy");
    }

现在当我只使用返回视图(&#34;购买&#34;,产品)时,我收到的输出和Url保持一致,因为我想要更改网址,当我使用时

return RedirectToAction("Buy", products);

我收到错误,因为我想将表单发布到Buy。 RedirectToAction中传递的参数是否合适,或者是否需要其他任何参数。 这是行动

@model IEnumerable<Shop_Online.com.Models.Product>
@{
ViewBag.Title = "Buy";
}
@using (Html.BeginForm())
{
<div style="width: 860px; margin: 0 auto" class="main">
    <table border="1" style="font-family: Verdana; font-size: 13px">
        <tr style="background-color: #f2f2f2">
            <th colspan="4">ITEM</th>
            <th>DELIEVERY DETAILS</th>
            <th>QTY</th>
            <th>SUB TOTAL</th>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td colspan="4" style="width: 46%">
                    <table style="font-family: Verdana; font-size: 13px">
                        <tr>
                            <td>
                                <img src="@Url.Content(item.Photo)" alt="Image" style="width:36px" />
                            </td>
                            <td>
                                @Html.DisplayFor(x => item.Model_Name)
                            </td>
                        </tr>
                        <tr>
                            <td style="color: #ccc">30 days Replacement</td>
                        </tr>
                    </table>
                </td>
                <td style="width: 39%">Free Delievery Delivered in 2-3 business days.</td>
                <td style="width: 5%">1</td>
                <td style="width: 50%"><b>Rs. @Html.DisplayFor(x => item.Price)</b></td>
            </tr>
        }
    </table>
    <div style="width: 100%; height: 70px; background-color: #f2f2f2">
        <div style="width: 75%; height: 70px; float: left; font-family: Verdana; font-size: 13px">
        </div>
        <div style="width: 25%; height: 70px; float: left; font-family: Verdana; padding-top: 20px; font-size: 13px">
            Estimated Price: <b>Rs.@ViewBag.total</b>
        </div>
    </div>
    <div class="order" style="width: 100%; height: 70px">
        <div class="left-order" style="width: 75%; height: 70px; float: left"></div>
        <div class="left-order" style="width: 25%; float: left; height: 70px">
            <input type="button" value="PLACE ORDER" style="border: 1px solid #ec6723; width: 216px; cursor: pointer; height: 45px; color: #fff; background: -webkit-linear-gradient(top,#f77219 1%,#fec6a7 3%,#f77219 7%,#f75b16 100%)" onclick="return confirm('Successfull placed order')" />
        </div>

    </div>
</div>
}

现在如何在视图中替换以下代码如果我使用TempData

@foreach(var item in Model)
{
 @Html.DisplayFor(model=>model.Name
 /some more code/
}

3 个答案:

答案 0 :(得分:3)

您无法在操作方法中将list或任何model个对象传递给RedirectToAction。由于RedirectToAction会导致HTTP 302 (Redirect)请求,这会让浏览器调用 GET 请求。

您应该使用TempData来保存Item_Post操作方法中的数据。

public ActionResult Item_Post()
    {
        List<Product> products=new List<Product>() ;
        int? total=0;
       HttpCookie cookie= Request.Cookies["myvalue"];
       if (Request.Cookies["myvalue"] != null)
       {        
        some logic here
       }  
       //save it to TempData for later usage
       TempData["products"] = products;

       //return View("Buy", products);
       //return RedirectToAction("Buy", new {id=products});

       return RedirectToAction("Buy");
    }

现在在Buy操作中使用TempData来获取您的数据。

[HttpGet]
public ActionResult Buy()
{
    var products = TempData["products"];
    //.. do anything
}

希望这有帮助。


<强>更新

使用以下代码进行Buy操作。

[HttpGet]
        public ActionResult Buy()
        {
            var products = TempData["products"] as List<Product>;
            return View(products);
        }

现在在视图中,使用foreach覆盖产品中的元素列表

@model IEnumerable<Shop_Online.com.Models.Product>

@foreach (var item in Model)
{
    <div>
        Item Id: @item.Id
    </div>
    <div>
        Item name: @item.Name
    </div>
}

现在这应显示所有项目的列表。

或者不是将TempData分配给模型类的对象,您也可以尝试使用以下代码替换上述foreach。

@if (TempData["products"] != null)
{
    foreach (var item in TempData["products"] as List<Product>)
    {
        <div>
            Item Id: @item.Id
        </div>
        <div>
            Item name: @item.Name
        </div>
    }
}

答案 1 :(得分:1)

您可以从RedirctToAction传递产品数组作为ID。

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.redirecttoaction%28v=vs.118%29.aspx

它接受RouteParamter或只是你在url的查询字符串中传递的值。

如果你想使用RedirectToAction,那么我建议你应该使用TempData。

public ActionResult Item_Post()
    {
        List<Product> products=new List<Product>() ;
        int? total=0;
       HttpCookie cookie= Request.Cookies["myvalue"];
       if (Request.Cookies["myvalue"] != null)
       {        
        some logic here
       }                   
       TempData["Products"] = products;
       return RedirectToAction("Buy");
    }

在您的购买行动中

 public ActionResult Buy()
{
   // Get value from TempData
   var products=  (List<Product>)TempData["Products"];
}

答案 2 :(得分:0)

您的Buy ActionResult是否接受List<Product>作为参数,例如:

public ActionResult Buy(List<Product> ids)
{
    ...
}

如果没有它,它将不知道如何处理产品列表