在视图中编辑后访问控制器中的视图模型

时间:2017-12-09 01:03:31

标签: c# asp.net-core-mvc

我正在制作一款具有购物车功能的应用。我想允许用户查看项目,然后将它们添加到购物车。

我想要遵循的基本工作流程如下:

  1. 用户查看可能的项目。
  2. 用户选择一个项目,弹出详细信息视图。
  3. 用户选择他们想要的选项(尺寸/颜色/数量/等)。
  4. 用户点击“添加到购物车”。
  5. 项目/选项已添加到购物车中。
  6. 我想我已经解决了,直到第5步。我无法工作。

    要显示项目/选项,我正在使用视图模型。其中包含项目的详细信息,可能的大小/颜色列表以及所选大小和颜色的字段。

    在视图中,我有一个“添加到购物车”按钮,该按钮调用生成项目视图模型的同一控制器中的方法。

    现在我需要按照用户编辑的方式获取项目视图模型,因此我知道他们想要的尺寸/颜色/数量。但我似乎无法访问它。

    我从Contoso大学示例中松散地开始使用此工作流程,他们使用“TryUpdateModelAsync”在编辑时更新记录(注意:不是我的代码):

        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditPost(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var studentToUpdate = await _context.Students.SingleOrDefaultAsync(s => s.ID == id);
            if (await TryUpdateModelAsync<Student>(
                studentToUpdate,
                "",
                s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate))
            {
                try
                {
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
                catch (DbUpdateException /* ex */)
                {
                    //Log the error (uncomment ex variable name and write a log.)
                    ModelState.AddModelError("", "Unable to save changes. " +
                                                 "Try again, and if the problem persists, " +
                                                 "see your system administrator.");
                }
            }
            return View(studentToUpdate);
        }
    

    但是他不适用于视图模型(或者我无法使其工作)。

    所以,我的问题是:在控制器将视图模型传递给视图,并且视图在同一控制器上调用方法之后,如何获取在视图中编辑的视图模型?

    对不起,如果这是一个有点混乱的问题 - 我一直在研究这个问题一段时间没有取得任何进展。

    ---编辑--- 编辑它以包含我的一些代码。首先,我有视图模型(ItemDetailViewModel):

        public class ItemDetailViewModel
    {
        public ItemDetailViewModel()
        {
    
        }
    
        public ItemDetailViewModel(Item item)
        {
            this.Item = item;
        }
        public Item Item { get; set; }
        public List<ItemSize> Sizes { get; set; }
        public List<ItemColour> Colours { get; set; }
        public int? SelectedSizeId { get; set; }
        public int? SelectedColourId { get; set; }
        public SelectList SizesSelectList { get; set; }
        public SelectList ColoursSelectList { get; set; }
    
        public bool HasSizes
        {
            get
            {
                if (Sizes == null)
                    return false;
                return Sizes.Count > 0;
            }
        }
    
        public bool HasColours
        {
            get
            {
                if (Colours == null)
                    return false;
                return Colours.Count > 0;
            }
        }
    }
    

    然后我们在ItemDetailkController这个类中生成详细信息:

            [Authorize]
        public async Task< IActionResult> Detail(string storeType,int menuid, int id)
        {
            ApplicationUser appUser = ConstantData.GetApplicationUser(_context, _userManager.GetUserId(User));
            if (appUser == null)
                return null;
            //Item item = await _context.Item.FindAsync(id);
            Item item = await _context.Item
                .Where(i => i.ID == id)
                .Include(i => i.ItemPriceBreaks)
                .FirstOrDefaultAsync();
            if (item == null)
                return null;
            if (item.CustomerID.HasValue && item.CustomerID != appUser.CustomerID)
                return null;
            ItemDetailViewModel itemDetailModel = new ItemDetailViewModel(item);
            itemDetailModel.Sizes = await _context.ItemSize
                .Where(s => s.ItemID == id)
                .OrderBy(s => s.SortOrder)
                .ToListAsync();
            if (item.Type != ItemTypeEnum.StandardItem)
            itemDetailModel.Colours = await _context.ItemColour
                    .Where(c => c.ItemID == id)
                    .ToListAsync();
            if (itemDetailModel.HasSizes)
                itemDetailModel.SizesSelectList = new Microsoft.AspNetCore.Mvc.Rendering.SelectList(itemDetailModel.Sizes, "ID", "Name");
            if (itemDetailModel.HasColours)
                itemDetailModel.ColoursSelectList = new Microsoft.AspNetCore.Mvc.Rendering.SelectList(itemDetailModel.Colours, "ID", "Name");
            return View(itemDetailModel);
        }
    

    这是显示视图模型的视图(Detail.cshtml):

     <h2>Item Detail</h2>
    
    <div>
        <h4>Details for this item</h4>
        <hr />
        <form asp-action="AddToCart">
            <dl class="dl-horizontal">
                <dt>Description</dt>
                <dd>@Html.DisplayFor(model => model.Item.Description)</dd>
                <dt>Short Description</dt>
                <dd>@Html.DisplayFor(model => model.Item.ShortDescription)</dd>
                <dt>Features</dt>
                <dd>@Html.DisplayFor(model => model.Item.Features)</dd>
                @if (Model.HasSizes)
                {
                    <dt>Size</dt>
                    <dd>
                        @Html.DropDownListFor(m => m.SelectedSizeId, Model.SizesSelectList, "Select a size")
                    </dd>
                }
                @if (Model.HasColours)
                {
                    <dt>Colour</dt>
                    <dd>@Html.DropDownListFor(m => m.SelectedColourId, Model.ColoursSelectList, "Select a colour")</dd>
                }
    
            </dl>
            <table class="table">
                <thead>
                <tr>
                    <th>Quantity</th>
                    <th style="text-align:right">Unit Price Ex Tax</th>
                    <th style="text-align:right">Unit Price Inc Tax</th>
                </tr>
                </thead>
                <tbody>
                @foreach (var price in Model.Item.ItemPriceBreaks)
                {
                    <tr>
                        <td>@Html.DisplayFor(modelItem => price.Quantity)</td>
                        <td style="text-align:right">@Html.DisplayFor(modelItem => price.UnitPriceExTax)</td>
                        <td style="text-align:right">@Html.DisplayFor(modelItem => price.UnitPriceIncTax)</td>
                    </tr>
                }
                </tbody>
            </table>
            <div class="form-group">
                <input type="submit" value="Add to Cart" class="btn btn-default" />
            </div>
        </form>
    
    </div>
    

    最后,在与以前相同的控制器中,我有这个方法:

        [HttpPost, ActionName("AddToCart")]
        [Authorize]
        public async Task<IActionResult> AddToCart(int id)
        {
            // How do I get ItemDetailViewModel from here?
            return null;
        }
    

    那么 - 我需要在“AddToCart”中添加什么才能获得修改过的ItemDetailViewModel?

0 个答案:

没有答案