2

私は一般的にasp .netとmvcに慣れていません。コントローラーの GET edit メソッドと POST edit メソッドを実装しています。厳密に型指定されたビューを使用してフォームを編集しています。モデルを POST 編集メソッドに戻していますが、保存方法がわかりません。これが私がこれまでに持っているものです...私が知っていることはあまりありません。

    [HttpPost]
    public ActionResult ModifyContract(ModContract mod)
    {
        // submit modified contract
        if (ModelState.IsValid)
        {
            OutlookMediaEntities1 db = new OutlookMediaEntities1();
            db.ObjectStateManager.ChangeObjectState(mod, EntityState.Modified);

            // save changes
            db.SaveChanges();

            return RedirectToAction("ContractDetails", "Contract", new { id = (int) ViewData["contractid"] });
        }
        else
        {
            ModelState.AddModelError("", "Missing necessary information");
            return View();
        }
    }

db.ObjectStateManager... 行で InvalidOperationException が発生しています。主キーを割り当てなかったことが原因である可能性があるとの記述があり、ModAds クラス (以下) に主キーが含まれていないことに気付きました。追加しましたが、同じエラーが発生します。スタック トレースは次のとおりです。


[InvalidOperationException: The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'oulookmediaweb.Models.ModContract'.]
   System.Data.Objects.ObjectStateManager.ChangeObjectState(Object entity, EntityState entityState) +278
   oulookmediaweb.Controllers.ContractController.ModifyContract(ModContract mod) in C:\Users\georgiev.1\Outlook4\oulookmediaweb\Controllers\ContractController.cs:1113
   lambda_method(Closure , ControllerBase , Object[] ) +163
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +205
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.c__DisplayClass42.b__41() +28
   System.Web.Mvc.Async.c__DisplayClass8`1.b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +50
   System.Web.Mvc.Async.c__DisplayClass39.b__33() +58
   System.Web.Mvc.Async.c__DisplayClass4f.b__49() +237
   System.Web.Mvc.Async.c__DisplayClass37.b__36(IAsyncResult asyncResult) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50
   System.Web.Mvc.Async.c__DisplayClass2a.b__20() +24
   System.Web.Mvc.Async.c__DisplayClass25.b__22(IAsyncResult asyncResult) +126
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +45
   System.Web.Mvc.c__DisplayClass1d.b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +61
   System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +49
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.c__DisplayClass8.b__3(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +25
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +49
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970141
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

ここにもモデルがあります:

public class ModContract
{
    public int contract_id;
    public string contract_name { get; set; }
    public List<ModAds> ads;

    public string print_product_id { get; set; }
    public string print_ad_option_id { get; set; }
}

public class ModAds
{
    public int contr_ad_id;
    public string name;
    public string product_name;
    public string adv_product;
    public List<string> editions;
    public double freq_disc;
    public double other_dis_dol;
    public double? other_dis_per;
    public string non_cash_note;
    public double non_cash_cons;
}

渡されたモデルを保存する方法がわかりません。私が見たすべてのチュートリアルには非常に単純なモデルがあり、保存は次のようなもので行われます。

db.Entry(model).State = EntityState.Modified;
db.SaveChanges();

コードに最初の行を入れても、最初の行はコンパイルされません。Entry というメソッドはありません。モデルはどのようにしてフォーム フィールドから新しい値を取得しますか? ビューはそのモデルをパラメーターとして渡すことをどのように認識しますか? ビューが強く型付けされているためですか?そうでない場合はどうなりますか?ビューはすべての入力を切り上げてフォーム要素を選択し、それらをモデルに入れますか? 私はそれがどのように機能するかについて混乱しています。最も重要なのは、モデルを保存する方法です。

ヘルプやヘルプへのリンクは大歓迎です! 前もって感謝します!

4

1 に答える 1