如何将从控制器发送到视图的viewmodel获取回控制器



我从控制器发送到视图对象列表,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));
}

相关内容

  • 没有找到相关文章