[英]Asp.Net MVC - Inserting multiple rows in Database
我正在構建一個電子商務應用程序,現在正在使用ProductAttributes。 我要處理大小,顏色和數量屬性。
示例 T恤具有多種顏色和尺寸以及不同數量。
Name - Color - Size - Qty
T-shirtA - Black - Small - 5pc
T-shirtA - Blue - Medium - 10pc
T-shirtA - Blue - Large - 4pc
我想處理他以上情況。
表
1. Product: Product_Id(pk), Name, Price, Description
2. ProductSizes: ProductSize_Id(pk), SizeName
3. ProductSizeValues: ProductSizeValue_Id(pk), ProductSize_Id(fk), Name
4. ProductColors: ProductColor_Id(pk), Name
5. ProductAttribues: ProductAttribute_Id(pk), ProductSize_Id(fk), ProductColor_Id(fk)
6. ProductAttribueValues: ProductAttributeValue_Id(pk), ProductAttribute_Id(fk), Product_Id(fk), ProductSizeValue_Id(fk), ProductColor_Id(fk), Quantity.
首先,我對如何存儲數量的顏色和尺寸感到困惑,然后安裝了OpenCart並看到了它們的數據庫架構,沒有看到上面的表格。
我已經將一些值直接插入數據庫中,並且一切正常。 獲得理想的結果。 但顯然我希望我的用戶使用ViewPage存儲這些詳細信息。
我創建了一個ViewModel
ProductAttributeViewModel.cs
public class ProductAttributesViewModel
{
public Product Product { get; set; }
public ProductAttribute ProductAttribute { get; set; }
public ProductAttributeValue ProductAttributeValue { get; set; }
public int ProductId { get; set; }
public string Name { get; set; }
[AllowHtml]
public string Description { get; set; }
public decimal? Price { get; set; }
public int? Quantity { get; set; }
public string Sizes { get; set; }
public int Stock { get; set; }
public int ProductColorVariantId { get; set; }
public int ProductSizeVariantId { get; set; }
public int ProductSizeVariantValueId { get; set; }
public int ProductAttributeId { get; set; }
public int ProductAttributeValueId { get; set; }
}
控制器我必須將數據插入到多個表中。 所以他是我的控制者
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddProduct(ProductAttributesViewModel newRecord)
{
IEnumerable<SelectListItem> productsizevariants = db.ProductSizeVariants.Select(c => new SelectListItem
{
Value = c.ProductSizeVariantId.ToString(),
Text = c.Name
});
ViewBag.ProductSizeVariantId = productsizevariants;
IEnumerable<SelectListItem> productsizevariantsvalues = db.ProductSizeVariantValues.Select(c => new SelectListItem
{
Value = c.ProductSizeVariantValueId.ToString(),
Text = c.Name
});
ViewBag.ProductSizeVariantValueId = productsizevariantsvalues;
IEnumerable<SelectListItem> productcolorvariantsid = db.ProductColorVariants.Select(c => new SelectListItem
{
Value = c.ProductColorVariantId.ToString(),
Text = c.Name
});
ViewBag.ProductColorVariantId = productcolorvariantsid;
var product = new Product
{
Name = newRecord.Name,
Description = newRecord.Description,
Price = newRecord.Price,
};
var productattributes = new ProductAttribute
{
ProductSizeVariantId = newRecord.ProductSizeVariantId,
ProductColorVariantId = newRecord.ProductColorVariantId,
ProductId = newRecord.ProductId
};
var productattributevalues = new ProductAttributeValue
{
ProductAttributeId = newRecord.ProductAttributeId,
ProductId = newRecord.ProductId,
ProductSizeVariantId = newRecord.ProductSizeVariantId,
ProductSizeVariantValueId = newRecord.ProductSizeVariantValueId,
ProductColorVariantId = newRecord.ProductColorVariantId,
Quantity = newRecord.Stock
};
db.Products.Add(product);
db.ProductAttributes.Add(productattributes);
db.ProductAttributeValues.Add(productattributevalues);
db.SaveChanges();
return RedirectToAction("Index", "Home");
}
一切都很好。 數據使用外鍵和所有值存儲在所有表中。 現在,我想添加動態文本字段以添加大小和顏色。
我已經將顏色和大小存儲在數據庫中,並從控制器中將這些值傳遞到下拉列表中並進行填充。
視圖
@model FypStore.ViewModels.ProductAttributesViewModel
@using (Html.BeginForm("AddProduct", "Store", FormMethod.Post, new { enctype = "multipart/form-data", @class = "form-horizontal col-md-12", role = "form" }))
{
<div class="form-group">
@Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label", data_val_required = "required" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Description, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextAreaFor(m => m.Description, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="row">
@*@Html.LabelFor(m => m.ProductSizeVariantId, new { @class = "col-md-2 control-label" })*@
<div class="col-md-2 control-label">
</div>
<div class="input_fields_wrap">
<button class="add_field_button">Add More Fields</button>
<div class="col-md-2">
@Html.DropDownList("ProductSizeVariantId", null, "Size", new { @class = "control-label" })
</div>
<div class="col-md-2">
@Html.DropDownList("ProductSizeVariantValueId", null, "Select Size", new { @class = "control-label" })
</div>
<div class="col-md-2">
@Html.DropDownList("ProductColorVariantId", null, "Select Color", new { @class = "control-label" })
</div>
<div class="col-md-2">
@Html.TextBoxFor(x => x.Stock, new { @placeholder = "Quantity", @class = "form-control" })
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Create Product" />
</div>
</div>
}
這是我想要實現的演示 。
$('.multi-field-wrapper').each(function() { var $wrapper = $('.multi-fields', this); $(".add-field", $(this)).click(function(e) { $('.multi-field:first-child', $wrapper).clone(true).appendTo($wrapper).find('input').placeholder('quantity').focus(); }); $('.multi-field .remove-field', $wrapper).click(function() { if ($('.multi-field', $wrapper).length > 1) $(this).parent('.multi-field').remove(); }); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form role="form" action="/wohoo" method="POST"> <input type="text" placeholder="Name" name="name"><br /> <input type="text" placeholder="Price" name="price"><br /> <input type="text" placeholder="Description" name="description"><br /> <label>Attributes</label> <div class="multi-field-wrapper"> <div class="multi-fields"> <div class="multi-field"> <select> <option>Green</option> <option>Blue</option> <option>Black</option> <option>Purple</option> <option>White</option> </select> <select> <option>XS</option> <option>Small</option> <option>Medium</option> <option>Large</option> <option>XL</option> </select> <input type="text" placeholder="quantity" name="quantity"> <button type="button" class="remove-field">Remove</button> </div> </div> <button type="button" class="add-field">Add field</button> </div> <button type="button">Create Product</button> </form>
如果我理解您的意見正確,那么您的視圖模型中就會有一個屬性列表。
因此,如果要使用它,則應將其放在列表中。
因此,您應該更改視圖模型:
//I put all properties of your list to separate model
public class AttriduteViewModel
{
public int ProductColorVariantId { get; set; }
public int ProductSizeVariantId { get; set; }
public int ProductSizeVariantValueId { get; set; }
public int ProductAttributeId { get; set; }
public int ProductAttributeValueId { get; set; }
public int? Quantity { get; set; }
}
public class ProductAttributesViewModel
{
public Product Product { get; set; }
public ProductAttribute ProductAttribute { get; set; }
public ProductAttributeValue ProductAttributeValue { get; set; }
public int ProductId { get; set; }
public string Name { get; set; }
[AllowHtml]
public string Description { get; set; }
public decimal? Price { get; set; }
public string Sizes { get; set; }
public int Stock { get; set; }
//note this line
public List<AttriduteViewModel> AdditionalAttridutes {get; set;}
}
基本上就是全部。 現在,您只應為您的AdditionalAttridutes
進行正確綁定。 使用Html.DropDownListFor
, Html.HiddenFor
和Html.TextBoxFor
等HtmlHelpers
使其更容易。 我只是在您的視圖中看不到它。
關鍵是,如果使用Helper創建input
,它們將獲得正確的name
Attribute,並且模型將在POST上正確綁定。
您將面對的另一件事是像示例中那樣動態創建新項目。 您應該考慮正確的名稱屬性。 我建議您檢查有關該問題的好答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.