将参数从视图传递到控制器

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();
        }

结果: