0

我用 aViewModel来表示我的数据库中的两个实体,“类别”和“制造商”,因为我希望它们作为下拉列表。我已经设法为它们创建了声音和工作下拉列表。

这是视图模型:

 public class New_Product_View_Model
  {
    public int SelectedManufacturerID { get; set; }
    public SelectList Manufacturers { get; set; }
    public int SelectedCategoryID { get; set; }
    public SelectList Categories { get; set; }
  }

这是 [HttpGet]Controller操作:

public ActionResult Insert_New_Product()
   {
        var dbcontext = new LNQ2SQLDataContext();
        var CatQ = from P in dbcontext.Categories
                where P.SUB_CAT == null
                select P;

        var ManQ = from P in dbcontext.Manufacturers
                   select P;

        var VM = new New_Product_View_Model();
        VM.Categories = new SelectList(CatQ, "CAT_ID", "CAT_Name");
        VM.Manufacturers = new SelectList(ManQ, "MAN_ID", "MAN_Name");

      //Passes the 'VM' to the view
        return View(VM);
   }

我的视图看起来像这样

@model MyAppName.ViewModels.New_Product_View_Model
@using (Html.BeginForm(FormMethod.Post))
    {
        @Html.DropDownListFor(m => m.SelectedCategoryID, Model.Categories, "-- Select a category --")
        <br />
        @Html.DropDownListFor(m => m.SelectedManufacturerID, Model.Manufacturers, "-- Select a manufacturer --")

    <input type="submit" value="Add New Product" />

    }

到目前为止一切正常

现在这里是[HttpPost] ActionResult :

[HttpPost]
public ActionResult Insert_New_Product(New_Product_View_Model NPVM)
    {
      //A few things here
      //then
        return View();
    }

当我单击页面中的提交按钮时,我收到此错误:

看这里的图片

据我所知,这是因为Model视图中null的 HttpPost 方法运行时。因为return在 HttpPost 操作中,没有New_Product_View_Model. 这很愚蠢,因为我不想再次将任何模型传递给视图!我只想在需要添加更多产品的情况下使用相同的页面。

我试图return用这个交换:

return View(new New_Product_View_Model());

但我收到此错误: 请参阅此处的图片

我也试过这个:

NPVM = new New_Product_View_Model();
return View(NPVM);

但只是得到了同样的错误。

有没有人有任何解决方案?我真的很感激任何帮助。

4

2 回答 2

2

HTTP 是无状态的,而 MVC 是 Statless Loving Web 开发框架的一个很好的例子。每个请求都像新的一样。因此,当您将模型发送回视图时,您应该重新填充 Collection 属性。

考虑使用PRGPost-Redirect-GET)模式。这意味着,如果您的交易(保存到数据库)成功,您应该执行重定向到某个Get操作以显示新产品

[HttpPost]
public ActionResult Insert_New_Product(New_Product_View_Model model)
{
  if(ModelState.IsValid)
  {     

    //Save & If everything is fine, Do A Redirect (PRG pattern) to Get action
    return RedirectToAction("ShowProduct",new { id=model.ID});
  }

   //Model validation failed. Reload the stuff and send back to view     

    model.Categories = GetCategories();
    model.Manufacturers = GetManufacturers ();

    return View(model);
}

public ActionResult ShowProduct(int id)
{
  var item=repo.GetItemFRomId(id);
  return View(item);
}

假设GetCategories()andGetManufacturers 方法返回您的类别和制造商的 SelectList,您可以使用它来绑定视图中的下拉菜单。

于 2012-08-01T18:18:03.913 回答
0

您需要将Categoriesand填充Manufacturers到模型中。
与 WebForms 不同,没有 ViewState 可以从中加载值。

最简单的解决方法是调用原始 (GET) 操作。

于 2012-08-01T18:16:46.347 回答