Передать список объектов из представления в контроллер - PullRequest
1 голос
/ 12 июля 2020

Я хочу передать список объектов из представления в действие контроллера.

Моя цель - я покажу список всех деталей продукта. Пользователь может редактировать любые данные (даже все данные).

Итак, после редактирования я хочу опубликовать весь список объекта для действия контроллера, где я решу что-то продолжить.

Мой пример кода: -

public class API_VM
{
    public API_VM()
    {
        elemetnNames = new HashSet<string>();
    }
    public List<XElement> Stoklar { get; set; }
    public HashSet<string> elemetnNames { get; set; }
    public string PaketAgirligi { get; set; }
    public string PaketGenisligi { get; set; }
    public string PaketUzunlgu { get; set; }
    public string PaketYuksekligi { get; set; }
    public string StokAded { get; set; }
    public string UrunAciklama { get; set; }
    public string Kategori { get; set; }
    public string UrunMarka { get; set; }
    public string UrunAdi { get; set; }
    public string UrunFiyat { get; set; }
    public string UrunDil { get; set; }
    public string SkuKodu { get; set; }
    public string ServisPolitikaNo { get; set; }
    public string KargoSablonID { get; set; }
    public string StokAzaltmaStrateji { get; set; }
    public string KargoyaVerilis { get; set; }
    public string UrunFoto1 { get; set; }
    public string UrunFoto2 { get; set; }
    public string UrunFoto3 { get; set; }
    public string UrunFoto4 { get; set; }
    public string UrunFoto5 { get; set; }
    public string UrunFoto6 { get; set; }
    public string ParentElement { get; set; }
    public string TedarikciLink { get; set; }


}

``

 public class API_List:PageModel
{
    [BindProperty]
    public List<API_VM> ApiList { get; set; }
}

@model API_List
@{
    ViewData["Title"] = "UrunlerListe";
    Layout = "~/Views/Shared/_Layout.cshtml";
    int i = 0;

}
    <<form class="form-horizontal" method="post" asp-action="UrunPost">
    <table class="table table-striped">
        <tr>
            <th>Product Name</th>
        </tr>
        @foreach (var item in Model.ApiList)
        {
            <tr>
                <td>
                    <input type="text" asp-for="ApiList[i].UrunAdi" value="@item.UrunAdi" />
                </td>
            </tr>
        }
    </table>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-default">Submit</button>
        </div>
    </div>
</form>
[HttpPost]
   public IActionResult UrunPost(API_List model) */ Model is always null.
   {

   }

1 Ответ

1 голос
/ 13 июля 2020

Привязка модели с использованием @​​​​​​​model List<API_VM> вместо @model API_List.

@model List<API_VM>

@{
    ViewData["Title"] = "UrunlerListe";
    Layout = null;

}
<form class="form-horizontal" method="post" asp-action="UrunPost">
    <table class="table table-striped">
        <tr>
            <th>Product Name</th>
        </tr>
        
            @for (int i = 0; i < Model.Count; i++)
            { 
                <tr>
                    <td>
                    <input type="text" asp-for="@Model[i].UrunAdi" value="@Model[i].UrunAdi" />
                    </td>
                </tr>
            }
    </table>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-default">Submit</button>
        </div>
    </div>
</form>

В контроллере вы можете использовать List<API_VM>.

    [HttpPost]
    public ActionResult UrunPost(List<API_VM> model)
    {

        API_List list = new API_List();
        list.ApiList = model;


        return View("~/Views/API_VMs/Index.cshtml", list);
    }

Скриншоты теста :

введите описание изображения здесь

ОБНОВЛЕНИЕ

Вы можете использовать IFormCollection для проверки разницы типа возвращаемого значения от FOREACH и FOR l oop.

    [HttpPost]
    public string UrunPost(IFormCollection collection)
    {
       //
    }

И вот еще одно решение, которое также может анализировать тип, но не рекомендует если у класса слишком много атрибутов для приведения.

    [HttpPost]
    public ActionResult UrunPost(IFormCollection collection)
    {
        var apivms = FormCollectionToAPIVM(collection);

        return View("~/Views/API_VMs/Index.cshtml", apivms);
    }

    private API_List FormCollectionToAPIVM(IFormCollection formCollection)
    {
        API_List apis = new API_List();

        for (var i = 0; i < formCollection.Count; i++)
        {
            string key = $"ApiList[{i}].UrunAdi";

            if (formCollection.ContainsKey(key)) { 
                
                var item = new API_VM();
                item.UrunAdi = formCollection[key];

                apis.ApiList.Add(item);
            }
        }

        return apis;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...