将参数从视图传递到控制器
Pass parameter from a view to a controller
我基本上希望能够将参数传递给视图(有效),如果用户按下 <a>
link(这不能按预期工作)。
我的初始观点定义为:
@model IEnumerable<Path.To.MyClass>
// Do stuff....
<a asp-controller="MyController" asp-action="MyView" asp-route-myProducts = "Model">Update</a>
MyController 中的 MyView 定义为:
[HttpGet]
public IActionResult MyView(IEnumerable<MyClass> myProducts)
{
//Insert a breakpoint
}
基本上我没有收到任何错误,但在我拥有 link myProducts 的视图中有一堆元素。但是,当我访问 MyView 中的断点时,myProducts 为空。
有人知道问题出在哪里吗?
我曾尝试对 MyView 使用 [HttpPost]
而不是 [HttpGet]
,但是当我 运行 使用 IIS Express 的程序时,我似乎遇到了无限循环。
编辑
我试过了
<input type="button" onclick="location.href='@Url.Action("MyView", "MyController", Model)'">Update</button>
现在也是同样的问题(控制器的参数为空,没有任何错误)。
编辑2:
我也试过像这样制作一个新的 class:
public class ProductList
{
List<MyClass> products {get;set;}
}
因此将 MyView 参数替换为 ProductList myProducts
而不是 IENumerable<MyClass> myProdcuts
。在视图中的 @url.Action
中,我也尝试使用 <input type="button" onclick="location.href='@Url.Action("MyView", "MyController", Model.AsList())'">Update</button>
。这给出了同样的问题(即没有错误,但我的控制器中的 ProductList myProducts 中没有元素)。
我会举例说明发布信息的一般逻辑
在我给出的示例中,我将产品列表传递给控制器。
型号类
public class ProductList
{
List<Product> products { get; set; }
}
public class Product
{
public int ID { set; get; }
public string ProductName { set; get; }
}
在控制器中
[HttpGet]
public IActionResult MyView()
{
var model = new ProductList();
model.products = new List<Product>();
Viewbag.Count = 5;
return View(model);
}
[HttpPost]
public IActionResult MyView(ProductList model)
{
foreach(Product item in model.products)
{
//do somethings
}
Viewbag.Count = 5;
return View(model);
}
可见
@model yournamespace.ProductList
@{
ViewBag.MTitle = "my view";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("MyView", "controllername", FormMethod.Post, new { enctype = "multipart/form-data"})) {
@Html.AntiForgeryToken() @Html.ValidationSummary(true)
@for(var i = 0; i < Viewbag.Count; i++) {
<div class="row">
>@Html.TextBoxFor(model => model[i].ID)
</div>
<div class="row">
@Html.TextBoxFor(model => model[i].ProductName)
</div>
}
<div class="row">
<button class="btn-control">add</button>
</div>
}
如果你想用<a></a>
传递一个列表,你可以尝试在视图中序列化模型,然后将数据反序列化到action.Here中的模型是一个演示:
型号:
public class ProductList
{
public List<MyClass> products { get; set; }
}
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
}
MyView1.cshtml:
@model Path.To.ProductList
@using Newtonsoft.Json;
<a href=@Url.Action("MyView","Test1",new {myProducts = JsonConvert.SerializeObject(Model) })>Update</a>
控制器:
[HttpGet]
public IActionResult MyView1()
{
ProductList l = new ProductList { products = new List<MyClass> { new MyClass { Id = 1, Name = "class1" }, new MyClass { Id = 2, Name = "class2" }, new MyClass { Id = 3, Name = "class3" } } };
return View(l);
}
[HttpGet]
public IActionResult MyView(string myProducts)
{
ProductList p = JsonConvert.DeserializeObject<ProductList>(myProducts);
return Ok();
}
结果:
我基本上希望能够将参数传递给视图(有效),如果用户按下 <a>
link(这不能按预期工作)。
我的初始观点定义为:
@model IEnumerable<Path.To.MyClass>
// Do stuff....
<a asp-controller="MyController" asp-action="MyView" asp-route-myProducts = "Model">Update</a>
MyController 中的 MyView 定义为:
[HttpGet]
public IActionResult MyView(IEnumerable<MyClass> myProducts)
{
//Insert a breakpoint
}
基本上我没有收到任何错误,但在我拥有 link myProducts 的视图中有一堆元素。但是,当我访问 MyView 中的断点时,myProducts 为空。
有人知道问题出在哪里吗?
我曾尝试对 MyView 使用 [HttpPost]
而不是 [HttpGet]
,但是当我 运行 使用 IIS Express 的程序时,我似乎遇到了无限循环。
编辑 我试过了
<input type="button" onclick="location.href='@Url.Action("MyView", "MyController", Model)'">Update</button>
现在也是同样的问题(控制器的参数为空,没有任何错误)。
编辑2: 我也试过像这样制作一个新的 class:
public class ProductList
{
List<MyClass> products {get;set;}
}
因此将 MyView 参数替换为 ProductList myProducts
而不是 IENumerable<MyClass> myProdcuts
。在视图中的 @url.Action
中,我也尝试使用 <input type="button" onclick="location.href='@Url.Action("MyView", "MyController", Model.AsList())'">Update</button>
。这给出了同样的问题(即没有错误,但我的控制器中的 ProductList myProducts 中没有元素)。
我会举例说明发布信息的一般逻辑
在我给出的示例中,我将产品列表传递给控制器。
型号类
public class ProductList
{
List<Product> products { get; set; }
}
public class Product
{
public int ID { set; get; }
public string ProductName { set; get; }
}
在控制器中
[HttpGet]
public IActionResult MyView()
{
var model = new ProductList();
model.products = new List<Product>();
Viewbag.Count = 5;
return View(model);
}
[HttpPost]
public IActionResult MyView(ProductList model)
{
foreach(Product item in model.products)
{
//do somethings
}
Viewbag.Count = 5;
return View(model);
}
可见
@model yournamespace.ProductList
@{
ViewBag.MTitle = "my view";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("MyView", "controllername", FormMethod.Post, new { enctype = "multipart/form-data"})) {
@Html.AntiForgeryToken() @Html.ValidationSummary(true)
@for(var i = 0; i < Viewbag.Count; i++) {
<div class="row">
>@Html.TextBoxFor(model => model[i].ID)
</div>
<div class="row">
@Html.TextBoxFor(model => model[i].ProductName)
</div>
}
<div class="row">
<button class="btn-control">add</button>
</div>
}
如果你想用<a></a>
传递一个列表,你可以尝试在视图中序列化模型,然后将数据反序列化到action.Here中的模型是一个演示:
型号:
public class ProductList
{
public List<MyClass> products { get; set; }
}
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
}
MyView1.cshtml:
@model Path.To.ProductList
@using Newtonsoft.Json;
<a href=@Url.Action("MyView","Test1",new {myProducts = JsonConvert.SerializeObject(Model) })>Update</a>
控制器:
[HttpGet]
public IActionResult MyView1()
{
ProductList l = new ProductList { products = new List<MyClass> { new MyClass { Id = 1, Name = "class1" }, new MyClass { Id = 2, Name = "class2" }, new MyClass { Id = 3, Name = "class3" } } };
return View(l);
}
[HttpGet]
public IActionResult MyView(string myProducts)
{
ProductList p = JsonConvert.DeserializeObject<ProductList>(myProducts);
return Ok();
}
结果: