在我的 mvc 3 网络商店应用程序中,我有这个模型:Items、Products、Shipping、Users 表,其中 1 个 Item 包含 1 个 Product、1 个 User 和 1 个 Shipping。我需要以某种方式创建和编辑项目。通过创建没有太多问题,因为我可以将“要填充的字段”作为参数传递给 Crete(Post) 方法。编辑存在一个问题 - 发生空引用异常。这是我的代码:(
控制器):
我将模型(项目类型)作为参数传递给 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>
}
当我填写表格并单击“安全”按钮时,NullReferenceException 发生在 UpdateProduct() 方法的 ProductRepository 类中:
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)
我认为问题与模型有关。
任何帮助都会很棒,对不起这么多代码)