簡體   English   中英

如何獲取viewmodel,從controller發送到view,返回到controller

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM