将列表作为 @Html.Hidden 传递并且列表正在被删除
Passing a List as @Html.Hidden and the list is being deleted
我在将列表从表单发送到控制器进行处理和编辑时遇到问题。它只是破坏列表并只传递一个空字符串。我需要维护列表,以便我可以在控制器中添加它。
视图如下所示:
@using (Html.BeginForm("AddToBasket", "Home", FormMethod.Post))
{
@Html.Hidden("product", product.Product)
@Html.Hidden("basketItems", Model.BasketItems)
<h3>@product.Product (£@product.Price)</h3>
<div class="menu-item-quantity">
<h4>Quanitity: @Html.TextBox("quantity", 0, new { @class = "form-control-quantity" })</h4>
</div>
<input class="btn btn-lg" type="submit" value="Add to basket" />
}
控制器:
public ActionResult AddToBasket(string product, int quantity, List<string>basketItems)
{
var products = new GetProductsList<ProductLookup>().Query().ToList();
var Result = new BuyViewModel
{
Products = products,
BasketItems = basketItems.ToList()
};
return View("Buy", Result);
}
和模型:
public class BuyViewModel
{
public IList<ProductLookup> Products { get; set; }
public List<string> BasketItems { get; set; }
}
我如何将这个列表一次性传送到控制器?
您不是要退回一件商品,而是要退回一个列表。
一种方法是返回同名表单元素数组,这样控制器就可以将其拼接回列表中。
这是一个例子:
而不是:
@Html.Hidden("basketItems", Model.BasketItems)
添加这个:
for (int i = 0; i < Model.BasketItems.Count; i++)
{
@Html.HiddenFor(m => m.BasketItems[i])
}
这将生成以下 html:
<input type="hidden" name="basketItems[0]" value="item 1" />
<input type="hidden" name="basketItems[1]" value="item 2" />
(也许你不需要@Html中的@,但我没有检查过)
更新
我创建了一个测试项目:
TestViewModel.cs
using System;
using System.Collections.Generic;
namespace WebApplication1.Models
{
public class TestViewModel
{
public string Name { get; set; }
public List<String> Items { get; set; }
}
}
HomeController.cs
using System.Collections.Generic;
using System.Web.Mvc;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var viewModel = new TestViewModel {
Name = "Test name",
Items = new List<string> { "item 1" , "item 2" }
};
return View(viewModel);
}
[HttpPost]
public ActionResult Index(string name, List<string> items)
{
var viewModel = new TestViewModel
{
Name = name,
Items = items
};
return View(viewModel);
}
}
}
Index.cshtml
@model WebApplication1.Models.TestViewModel
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
for (int i = 0; i < Model.Items.Count; i++)
{
@Html.HiddenFor(m => m.Items[i])
}
<div class="">
@Html.TextBoxFor(m => m.Name)
</div>
<input type="submit" value="save" />
}
当我点击保存时,表单再次显示,但现在显示的是之前表单中的值
我对这个修复如此简单感到恼火。如果列表作为 null 通过,我在控制器中添加了一个检查以做出反应。
[HttpPost]
public ActionResult Buy(string product, int quantity, List<string>BasketItems)
{
var products = new GetProductsList<ProductLookup>().Query().ToList();
**for (int i = 0; i < quantity; i++)
{
if (BasketItems == null)
{
BasketItems = new List<string> { product };
}
else
{
BasketItems.Add(product);
}
}**
var Result = new BuyViewModel
{
Products = products,
BasketItems = BasketItems
};
return View("Buy", Result);
}
我还更改了视图以使用 HiddenFor 而不是 hidden
我在将列表从表单发送到控制器进行处理和编辑时遇到问题。它只是破坏列表并只传递一个空字符串。我需要维护列表,以便我可以在控制器中添加它。
视图如下所示:
@using (Html.BeginForm("AddToBasket", "Home", FormMethod.Post))
{
@Html.Hidden("product", product.Product)
@Html.Hidden("basketItems", Model.BasketItems)
<h3>@product.Product (£@product.Price)</h3>
<div class="menu-item-quantity">
<h4>Quanitity: @Html.TextBox("quantity", 0, new { @class = "form-control-quantity" })</h4>
</div>
<input class="btn btn-lg" type="submit" value="Add to basket" />
}
控制器:
public ActionResult AddToBasket(string product, int quantity, List<string>basketItems)
{
var products = new GetProductsList<ProductLookup>().Query().ToList();
var Result = new BuyViewModel
{
Products = products,
BasketItems = basketItems.ToList()
};
return View("Buy", Result);
}
和模型:
public class BuyViewModel
{
public IList<ProductLookup> Products { get; set; }
public List<string> BasketItems { get; set; }
}
我如何将这个列表一次性传送到控制器?
您不是要退回一件商品,而是要退回一个列表。
一种方法是返回同名表单元素数组,这样控制器就可以将其拼接回列表中。
这是一个例子:
而不是:
@Html.Hidden("basketItems", Model.BasketItems)
添加这个:
for (int i = 0; i < Model.BasketItems.Count; i++)
{
@Html.HiddenFor(m => m.BasketItems[i])
}
这将生成以下 html:
<input type="hidden" name="basketItems[0]" value="item 1" />
<input type="hidden" name="basketItems[1]" value="item 2" />
(也许你不需要@Html中的@,但我没有检查过)
更新 我创建了一个测试项目:
TestViewModel.cs
using System;
using System.Collections.Generic;
namespace WebApplication1.Models
{
public class TestViewModel
{
public string Name { get; set; }
public List<String> Items { get; set; }
}
}
HomeController.cs
using System.Collections.Generic;
using System.Web.Mvc;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var viewModel = new TestViewModel {
Name = "Test name",
Items = new List<string> { "item 1" , "item 2" }
};
return View(viewModel);
}
[HttpPost]
public ActionResult Index(string name, List<string> items)
{
var viewModel = new TestViewModel
{
Name = name,
Items = items
};
return View(viewModel);
}
}
}
Index.cshtml
@model WebApplication1.Models.TestViewModel
@{
ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
for (int i = 0; i < Model.Items.Count; i++)
{
@Html.HiddenFor(m => m.Items[i])
}
<div class="">
@Html.TextBoxFor(m => m.Name)
</div>
<input type="submit" value="save" />
}
当我点击保存时,表单再次显示,但现在显示的是之前表单中的值
我对这个修复如此简单感到恼火。如果列表作为 null 通过,我在控制器中添加了一个检查以做出反应。
[HttpPost]
public ActionResult Buy(string product, int quantity, List<string>BasketItems)
{
var products = new GetProductsList<ProductLookup>().Query().ToList();
**for (int i = 0; i < quantity; i++)
{
if (BasketItems == null)
{
BasketItems = new List<string> { product };
}
else
{
BasketItems.Add(product);
}
}**
var Result = new BuyViewModel
{
Products = products,
BasketItems = BasketItems
};
return View("Buy", Result);
}
我还更改了视图以使用 HiddenFor 而不是 hidden