Как обновить список с учетом viewmodel? Передача данных из представления в контроллер - PullRequest
0 голосов
/ 26 марта 2019

Я передаю viewmodel для создания вида, в котором я выбираю несколько свойств из выпадающего списка, а затем создаю новую модель в базе данных.Проблема в том, что мне нужно выбрать продукт из выпадающего списка и после нажатия кнопки добавить продукт в список (который определен в модели).Вы можете увидеть код ниже, у меня проблема с передачей идентификатора продукта, поскольку он всегда нулевой

SellsViewModel:

public class SellsViewModel
    {
        public List<Center> center { get; set; }
        public List<Leader> leader { get; set; }
        public List<Member> member { get; set; }
        public List<Group> group { get; set; }
        public Sell sell { get; set; }
        public Guid productSelection { get; set; }
        public IEnumerable<Product> product { get; set; }
        public IEnumerable<Product> selectedProducts { get; set; }
    }

Create.cshtml

@model Medical.ViewModels.SellsViewModel

@{
    var addproduct = Model.product.Select(product => new SelectListItem
    {
        Text = product.Name,
        Value = product.Id.ToString()
    });
}
...
<div class="form-group">
                <div align="right" class="col-md-2">
                    <b>Delivery</b>
                </div>
                <div align="center" class="col-md-2">
                    @Html.DropDownListFor(m => m.productSelection, addproduct, "-- Choose product --")
                </div>
                <div class="col-md-2">
                    <a asp-action="AddProducttoSell" method="post" asp-route-id="@Model.productSelection" class="btn btn-primary">Add</a>
                </div>
            </div>

Контроллер:

[HttpGet]
        public IActionResult AddProducttoSell(Guid id)
        {
            var sProduct = _context.Products.FirstOrDefault(p => p.Id == id);
            svm.selectedProducts.ToList().Add(sProduct);
            return RedirectToAction(nameof(Create));
        }

По сути, я хочу, чтобы при выборе товара в представлении я добавлял его в список selectedProducts в viewmodel, а затем возвращал его для просмотра.После этого я отправлю новую модель в базу данных.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
@section scripts
    {
    @*//the natural progression for what you are doing is to change the href not the asp-route-id, because
        //href is what gets rendered.  So you can do the following--and tighten it up--
        //you can also use FormCollection, or even possibly window.location, but the best way from Microsoft's
        //tutorial is to use a model like my previous post*@
    <script>
        $(document).ready(function () {
            $("#DropDownElement").change(function () {
                $("#PostingElement").attr("href", "/Sells/Edit/" + $("#DropDownElement").val());
            })
        });
    </script>
}

Мое действие выглядит следующим образом.Я использую Edit вместо AddProducttoSell

    // GET: Sells/Edit/5
    public async Task<IActionResult> Edit(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var sell = await _context.Sells.FindAsync(id);
        if (sell == null)
        {
            return NotFound();
        }
        return View(sell);
    }
0 голосов
/ 27 марта 2019

Я получил ваш пример для работы в Core.

Сначала я последовал этому уроку, внеся соответствующие изменения:

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro?view=aspnetcore-2.2

Это код, начинающийся с моего Model-codeFirst и моей ViewModel:

namespace SOPassDataViewToController.Models
{
    public class Sell
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

namespace SOPassDataViewToController.Models
{
    public class Product
    {
        public int Value { get; set; }
        public string Text { get; set; }
    }

    public class SellsViewModel
    {
        public List<Product> Products { get; set; }
        public int productSelection { get; set; }
    }
}

Вот мой код контроллера:

[HttpPost]
public IActionResult AddProducttoSell(SellsViewModel sellsviewmodel)
{
    //put breakpoint here to interrogate sellsviewmodel-productSelection
    var viewModel = PrepViewModel();
    return View(viewModel);
}

// GET: Sells
// I'm using this method instead of AddProducttoSell
//public async Task<IActionResult> Index()
public IActionResult Index()
{
    var viewModel = PrepViewModel();
    //return View(await _context.Sells.ToListAsync());
    return View(viewModel);
}

public SellsViewModel PrepViewModel()
{
    //prepping view model
    //sending view model to view
    SellsViewModel viewModel = new SellsViewModel();
    viewModel.Products = new List<Product>();
    var products = _context.Sells.ToList();
    foreach (Sell product in products)
    {
        var eachProduct = new Product();
        eachProduct.Value = product.ID;
        eachProduct.Text = product.Name;
        viewModel.Products.Add(eachProduct);
    }
    return viewModel;
}

Вот мой взгляд Index.cshtml:

@model SOPassDataViewToController.Models.SellsViewModel
@*need the form tag*@
<form asp-action="AddProducttoSell">
    <div class="form-group">
        <div align="right" class="col-md-2">
            <b>Delivery</b>
        </div>
        <div align="center" class="col-md-2">
            @*@Html.DropDownListFor(m => m.productSelection, addproduct, "-- Choose product --")*@
            @Html.DropDownListFor(m => m.productSelection, new SelectList(Model.Products, "Value", "Text"))
        </div>
        <div class="col-md-2">
            @*took out will need to put back asp-route-id="@Model.productSelection"*@
            @*<a asp-action="AddProducttoSell" method="post" asp-route-id="@Model.productSelection" class="btn btn-primary">Add</a>*@
            <div class="form-group">
                <input type="submit" value="AddProducttoSell" class="btn btn-primary" />
            </div>
        </div>
    </div>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...