我正在制作一款具有购物车功能的应用。我想允许用户查看项目,然后将它们添加到购物车。
我想要遵循的基本工作流程如下:
我想我已经解决了,直到第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?