0

さて、私はMVCにまったく慣れていないので、いくつかの概念に頭を悩ませようとしています。小さなアプリケーションを作成しました...

このアプリケーションには、新しい個人レコードを作成するためのビューがあります。ビューはモデルViewPageにバインドされています...そして、 Newメソッドを持つ個人コントローラーが関連付けられています...

IndividualControllerのNewメソッドは次のようになります...

public ActionResult New()
    {
        var i = new Individual();

        this.Title = "Create new individual...";
        i.Id = Guid.NewGuid();

        this.ViewData.Model = new Individual();


        return View();
    }

今、上記のすべてが機能しているようです。ビューが読み込まれると、個人オブジェクトからデータを取得できます。コントローラーを介してデータを保存しようとすると、問題が発生します...

私のIndividualControllerには、タイプIndividualの受信パラメーターを受け入れるSaveメソッドもあります。メソッドは次のようになります...

   public ActionResult Save(IndividualService.Individual Individual)
    {
        return RedirectToAction("New");
    }

さて、私の見解では、標準のhtmlリンク/hrefを「保存」ボタンとして使用したかったので、ActionLinkを次のように定義しました...

 <%=Html.ActionLink("Save", "Save") %>

また、私の見解で定義されているように、最初の名前をテストとして保持する単一のテキストボックスを作成しました...

 <% using (Html.BeginForm()) { %>
     <%=Html.TextBox("FirstName", ViewData.Model.FirstName)%>
 <% } %>

そのため、Saveメソッドにブレーク ポイントを設定し、ビューで [保存] リンクをクリックすると、コントローラー内でブレーク ポイントがヒットします。問題は、Save メソッドの入力パラメーターが null であることです。名のテキストボックスに値を入力しても...

明らかに、私は完全に間違ったことをしています。誰か私を正してくれませんか...

前もって感謝します...

4

3 に答える 3

1

New コントローラー メソッドは、個人を作成する必要はありません。おそらく、タイトルを設定してビューを返したいだけですが、承認処理が必要になる場合があります。以下は、私のプロジェクトの 1 つの例です。

    [AcceptVerbs( HttpVerbs.Get )]
    [Authorization( Roles = "SuperUser, EditEvent, EditMasterEvent")]
    public ActionResult New()
    {
        ViewData["Title"] = "New Event";
        if (this.IsMasterEditAllowed())
        {
            ViewData["ShowNewMaster"] = "true";
        }

        return View();
    }

保存アクションは、フォームから入力を受け取り、新しいモデル インスタンスを作成して永続化する必要があります。私の例は、ここに投稿したいものよりも少し複雑なので、単純化しようとします。モデル バインディングを使用するのではなく FormCollection を使用していることに注意してください。ただし、それも機能させることができるはずです。

    [AcceptVerbs( HttpVerbs.Post )]
    [Authorization( Roles = "SuperUser, EditEvent, EditMasterEvent")]
    public ActionResult Save( FormCollection form )
    {
         using (DataContext context = ...)
         {
              Event evt = new Event();
              if (!TryUpdateModel( evt, new [] { "EventName", "CategoryID", ... }))
              {
                  this.ModelState.AddModelError( "Could not update model..." );
                  return View("New");  // back to display errors...
              }
              context.InsertOnSubmit( evt );
              context.SubmitChanges();
              return RedirectToAction( "Show", "Event", new { id = evt.EventID } );
         }
    }
于 2009-01-16T15:13:11.873 に答える
0

New メソッドで新しい Indvidual オブジェクトを作成しないと、ビューがテキストボックスを関連付けられたモデルにバインドしようとすると、ビューの下の行で NullReferenceException が発生します...

`<%=Html.TextBox("FirstName", ViewData.Model.FirstName)%>`

保存方法について。私のビューは強く型付けされているため、私が理解していることから、次のようなメソッドシグネチャを使用できるはずはありません...

   `public ActionResult New(IndividualService.Individual ind)
    {
        return View();
    }`

それがモデルバインディングの背後にある目的だと思いました..?

于 2009-01-16T15:30:49.653 に答える
0

今していることから一歩下がって、こちらのチュートリアル/ビデオのいくつかを実行することを強くお勧めしますhttp://www.asp.net/learn/

厳密に型指定されている場合は、出力を生成するためにそのビューを選択しViewたときに、ビューがより適切に にアクセスできることを意味します。ControllerModel

ただし、フォームが投稿されたときや URL がナビゲートされたときなど、その後クライアントから返されるものについては責任を負いViewません。

ASP.NET-MVC は、URL 内の情報を使用してController、要求を渡す先を決定します。その後、リクエスト内の他のさまざまな要素をModelクラスのインスタンスに解決するのはコントローラーの役割です。

着信要求とコントローラーの関係は、ASP.NET-MVC ルーティングがコントローラーに与える重要な支援によって曇っています。たとえば、コントローラーメソッドにパラメーターを提供するようにルートを定義できます。これはコントローラーが必要とするすべてであるため、http 要求に関連するメソッド内のコードは表示されません。ただし、コントローラのメソッド単純に http 要求を処理していることを理解しておいてください。

上記から、モデルからクラスのインスタンスをコントローラーのパブリック メソッドに渡すには、リクエストのライフサイクルが早すぎることがわかると思います。インスタンス化が必要な場合、どのモデルクラスを決定するかはコントローラー次第です。

于 2009-01-16T20:36:39.740 に答える