0

ViewModelドロップダウンリストとして使用したいので、データベース内の2つのエンティティ「Categories」と「Manufacturers」を表すためにを使用しました。両方のサウンドと作業用のドロップダウンリストを作成することができました。

ViewModelは次のとおりです。

 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はビュー内のがnullHttpPostメソッドが実行されるときだからです。returnHttpPostアクションには、のインスタンスがないためです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はStatlessLovingWeb開発フレームワークであることの美しい例です。各リクエストは新品のようです。したがって、モデルをビューに戻すときに、コレクションプロパティを再設定する必要があります。

PRGPost-Redirect-GET)パターンの使用を検討してください。つまり、トランザクション(DBに保存)が成功した場合は、アクションにリダイレクト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()GetManufacturers メソッドは、カテゴリとメーカーのSelectListを返します。これを使用して、ビューのドロップダウンをバインドできます。

于 2012-08-01T18:18:03.913 に答える
0

CategoriesManufacturersをモデルに入力する必要があります。
WebFormsとは異なり、値をロードするViewStateはありません。

最も簡単な修正は、元の(GET)アクションを呼び出すことです。

于 2012-08-01T18:16:46.347 に答える