[英]How to get viewmodel, which was sent to view from controller, back to controller
我從 controller 發送來查看對象列表,viewmodel 是 object,帶有一些需要在頁面上顯示的屬性和 pagedList。 並且通過按下按鈕,這個列表需要作為文件導出,也就是說,它需要從 go 返回到 controller 並在那里進行處理。
Model:
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。
我的 controller
[HttpPost]
public FileResult SaveAsFile(PagedList<Product> viewmodel)
{
...
}
而我的看法
@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>
我已經嘗試添加到 controller 參數標簽 [FromForm]、[FromBody](實際上是所有可用標簽)。
在視圖中嘗試使用表單中的隱藏字段,沒有它只是提交; 把形式放在局部視圖上; 其他 forms: ajax, Html.ActionLink("另存為文件", "SaveAsFile", new {Model}).
在調試模式 Model.List 上有 21 個項目(但它可以有更多,比如 2000 個項目),但是當我按下按鈕時,viewmodel 正在創建新的。
問題: viewmodel 是新創建的,我無法將我的完整 viewmodel 恢復到 controller
我將不勝感激任何幫助:)
當您將數據從Controller
方法發送到您的View
時,您可以在Session
變量中設置您的ViewModel
數據:
為了設置你的Session
,你可以按照這個 SO answer
設置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
,然后在不使用form
的情況下將其發送給您的Controller
方法:
創建一個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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.