我从控制器发送到视图对象列表,viewmodel是具有一些属性和pagedList的对象,需要在页面上显示。通过按下按钮,该列表需要导出为文件,也就是说,它需要返回控制器并在那里进行处理。
模型:
public class ProductsList : ListViewModel<Product>
{
public ProductsList(string prefix) : base(prefix){ }
public ProductsList(PagedList<Product> products)
{
List = products;
}
public int? ProductTypeFilter {get;set; }
public string ProductTypeFilterName {get; set;}
public string FilterBy { get; set; }
}
ListViewModel只包含PagedList。
我的控制器
[HttpPost]
public FileResult SaveAsFile(PagedList<Product> viewmodel)
{
...
}
And my view
@model MyProject.ViewModels.ProductsList
if (Model.List.Count > 0)
{
<table id="products_table">
<colgroup>
<col class="productType"/>
</colgroup>
<thead>
<tr>
<th >
Product type
</th>
</tr>
</thead>
<tbody>
@{ var i = 0; }
@foreach (var item in Model.List)
{
<tr>
<td onclick="window.location='@Url.Action("Details", new {id = item.Id})'">
<p>
@item.Type
</p>
</td>
}
</tr>
i++;
}
</tbody>
</table>
}
<form asp-action="SaveAsFile" enctype="multipart/form-data" method="post">
@Html.HiddenFor(m => list);
<input type="submit" value="Save as File"/>
</form>
我已经尝试添加到控制器参数标签[FromForm], [FromBody](实际上所有可用的标签)。
In view with hidden field In form, without field with submit;把形式放在局部视图上;其他形式:ajax, Html.ActionLink("Save as File";SaveAsFile"; new {Model}).
On debug mod Model。列表有21个项目(但它可以有更多,如2000项),但当我按下按钮,视图模型正在创建新的。
问题:视图模型正在新建,我无法将完整的视图模型返回到控制器
我将感激你的任何帮助:)
当您从Controller
方法向View
发送数据时,您可以在Session
变量中设置ViewModel
数据:
为了设置您的Session
,您可以遵循此S.O回答
一旦你的Session
设置好了,然后你可以把你的ViewModel
放在里面,像
HttpContext.Session.SetObjectAsJson("ProductsList", productslist);
然后在POST
方法中检索它,像这样:
[HttpPost]
public FileResult SaveAsFile(PagedList<Product> viewmodel)
{
//Get your viewmodel here
var list = HttpContext.Session.GetObjectFromJson<ProductsList>("ProductsList");
}
你也可以序列化你的ViewModel
,然后发送你的Controller
方法,而不使用form
:
创建ActionLink
:
@Html.ActionLink("Submit", "SaveAsFile", "Home", new { jsonModel= Json.Encode(Model.list) }, null)
和你的Controller
方法:
public FileResult SaveAsFile(string jsonModel)
{
var serializer= new DataContractJsonSerializer(typeof(Model.Product));
var yourmodel= (Product)serializer.ReadObject(GenerateStreamFromString(jsonModel));
}