私の mvc 3 Web ストア アプリには、Items、Products、Shipping、Users テーブルというモデルがあります。ここで、1 つの Item には 1 つの Product、1 つの User、および 1 つの Shipping が含まれます。どうにかしてアイテムを作成および編集する必要があります。作成すると、「入力するフィールド」をパラメーターとして Crete(Post) メソッドに渡すことができるため、多くの問題はありません。編集には 1 つの問題があります - Null 参照例外が発生します。これが私のコードです:
(コントローラー):
モデル (タイプ Item) をパラメーターとして Edit Post メソッドに渡し、製品と配送を取得します。
[HttpGet]
public ViewResult Edit(int itemId)
{
Item target = _itemsRepository.GetItem(itemId);
return View(target);
}
[HttpPost]
public ActionResult Edit(Item model)
{
Product p = model.Product;
Shipping s = model.Shipping;
// here goes some validation stuff
if (ModelState.IsValid)
{
_productRepository.UpdateProduct(p);
_shippingRepository.UpdateShipping(s);
return RedirectToAction("Content");
}
return View();
}
強く型付けされたビュー (フォームに入力する場所):
@model WebStore.WebStoreModels.Item
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Product</legend>
@Html.HiddenFor(i => i.ItemId)
<p>Name: </p>
<p>
@Html.EditorFor(i => i.Product.Name)
@Html.ValidationMessageFor(i => i.Product.Name)
</p>
// and so on
</fieldset>
<fieldset>
<legend>Shipping</legend>
<p>Cost: </p>
<p>
@Html.EditorFor(i => i.Shipping.Cost)
@Html.ValidationMessageFor(i => i.Shipping.Cost)
</p>
// so on
</fieldset>
<p>
<input type="submit" value="Save"/>
</p>
}
そして、フォームに入力して「安全」ボタンをクリックすると、 UpdateProduct() メソッドの ProductRepository クラスで NullReferenceException が発生します。
public class ProductRepository : IProductRepository
{
private WebStoreDataContext _dataContext;
public ProductRepository(WebStoreDataContext dataContext)
{
_dataContext = dataContext;
}
public Product GetProduct(int productId)
{
return _dataContext.Products.SingleOrDefault(p => p.ProductId == productId);
}
public void UpdateProduct(Product p)
{
var dbProduct = GetProduct(p.ProductId);
dbProduct.Name = p.Name; // here the exception occures
dbProduct.Description = p.Description;
dbProduct.Price = p.Price;
dbProduct.Category = p.Category;
dbProduct.SubCategory = p.SubCategory;
_dataContext.SubmitChanges();
}
この割り当てを使用できないようです:
Product p = model.Product;
私も試しました:(ビューで、Edit(Post)メソッドでProductに割り当てます)
TempData["product"] = @Model.Product;
また:(ビューで)
@Html.Hidden("product", @Model.Product)
それをパラメータとして Edit(Post) メソッドに渡します。
[HttpGet]
public ViewResult Edit(Product p, Shipping s)
問題はモデルに関連していると思います。
どんな助けでも素晴らしいでしょう、コードが多すぎて申し訳ありません)