これが私のコードですAddNewProductViewModel
using AccessorizeForLess.Data;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
namespace AccessorizeForLess.ViewModels
{
public class AddNewProductViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public decimal Price { get; set; }
public string AltText { get; set; }
public int Quantity { get; set; }
public string ImagePath { get; set; }
public HttpPostedFileBase Image { get; set; }
public List<ProductCategory> Category { get; set; }
}
}
これが私のコントローラのCreateメソッドです
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(AddNewProductViewModel model)
{
ProductImageViewModel image = new ProductImageViewModel() { ImagePath = "/Content/ProductImages/" + model.Image.FileName, AltText = model.AltText };
ProductImage newImage = new ProductImage() { ImagePath = image.ImagePath, AltText = image.AltText };
entities.ProductImages.Add(newImage);
await entities.SaveChangesAsync();
int ImageId = newImage.ProductImageId;
Product product = new Product()
{
ProductImageId = ImageId,
ProductName = model.Name,
ProductDescription = model.Description,
ProductPrice = model.Price,
Quantity = model.Quantity
CategoryID = model.
};
string file = model.Image.FileName;
string path = Server.MapPath(@"~/Content/ProductImages");
string fullPath = path + @"\" + file;
try
{
model.Image.SaveAs(path + @"\" + file);
if (ModelState.IsValid)
{
entities.Products.Add(product);
await entities.SaveChangesAsync();
return RedirectToAction("Create");
}
}
catch (Exception ex)
{
ViewBag.Message = ex.ToString();
}
//ViewBag.ProductImageId = new SelectList(entities.ProductImages, "ProductImageId", "ImagePath", product.ProductImageId);
return View("Create");
}
そして今、私のビューにDropDownListを設定しようとしています:
<div class="form-group">
@Html.LabelFor(model => model.Category, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Category.Id, new SelectList(Model.Category,"Value","Text"), "- Please Select -")
@Html.ValidationMessageFor(model => model.Category)
</div>
</div>
そして、これは私が得ているエラーです:
CS0411:メソッド 'System.Web.Mvc.Html.SelectExtensions.DropDownListFor(System.Web.Mvc.HtmlHelper、System.Linq.Expressions.Expression>、System.Collections.Generic.IEnumerable、object)'の型引数はできません使用法から推測。型引数を明示的に指定してみてください。
[〜#〜]編集[〜#〜]
これが新しいAddNewProductViewModelです。
using AccessorizeForLess.Data;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
namespace AccessorizeForLess.ViewModels
{
public class AddNewProductViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public decimal Price { get; set; }
public string AltText { get; set; }
public int Quantity { get; set; }
public string ImagePath { get; set; }
public HttpPostedFileBase Image { get; set; }
public ProductCategory Category { get; set; }
public int SelectedCategoryId { get; set; }
public List<ProductCategory> Categories { get; set; }
}
}
そして、ドロップダウンリストでの私の最新の試み
<div class="form-group">
@Html.LabelFor(model => model.Category, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.SelectedCategoryId,
new SelectList(Model.Categories, "CategoryId", "CategoryName"), "- Please Select -")
@Html.ValidationMessageFor(model => model.Category)
</div>
</div>
今、私はこの行でNullReferenceExceptionを取得しています
@Html.DropDownListFor(model => model.SelectedCategoryId,
私のコードで誰かが私にここで間違っていることを教えてもらえれば、私は昨夜からこれに苦労しています。
私は問題を解決しました(ヒントを提供してくれたみんなに感謝します)。これは、私のように問題を抱えている可能性がある人のためのものです。
Createメソッドを次のように変更しました:
// GET: /Products/Create
public ActionResult Create()
{
var p = new AddNewProductViewModel();
p.Categories = entities.ProductCategories.ToList();
return View(p);
}
私のAddNewProductViewModelは次のようになります。
using AccessorizeForLess.Data;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
namespace AccessorizeForLess.ViewModels
{
public class AddNewProductViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public decimal Price { get; set; }
public string AltText { get; set; }
public int Quantity { get; set; }
public HttpPostedFileBase Image { get; set; }
public int SelectedCategoryId {get;set;}
public List<ProductCategory> Categories { get; set; }
public ProductCategory Category { get; set; }
}
}
私の見解:
<div class="form-group">
@Html.LabelFor(model => model.SelectedCategoryId, "Category",new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.SelectedCategoryId, new SelectList(Model.Categories, "CategoryId", "CategoryName"), "- Please Select -")
@Html.ValidationMessageFor(model => model.SelectedCategoryId)
</div>
</div>
助けてくれてありがとう:)
まず、ViewModelを変更してSelectedCategoryId
を含め、オプションをCategories
に変更します。
あなたのget
のコードを見ずに、私はProductCategory
を次のように理解しています:
public class ProductCategory {
public int Id {get;set;}
public string Name { get;set;}
}
かみそりのマークアップは次のようになります。
<div class="form-group">
@Html.LabelFor(model => model.Categories, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.SelectedCategoryId,
new SelectList(Model.Categories, "Id", "Name"), "- Please Select -")
@Html.ValidationMessageFor(model => model.Categories)
</div>
</div>
最初のパラメータは選択されたカテゴリであり、オプションはCategories
から読み込まれます。
コントローラーを使用してリストを作成し、ビューからリストを呼び出します。
コントローラ:
public static List<SelectListItem> GetDropDown()
{
List<SelectListItem> ls = new List<SelectListItem>();
lm = (call database);
foreach (var temp in lm)
{
ls.Add(new SelectListItem() { Text = temp.name, Value = temp.id });
}
return ls;
}
ドロップダウン:を呼び出します
@Html.DropDownListFor(x => x.Field, PathToController.GetDropDown())