2009-03-27 11 views
3

ASP.NET MVCアプリケーションのエンティティを更新するためのシンプルなフォームがあります。ユーザーがフォームを送信し、自分のコントローラー上の適切なアクションを呼び出して、ユーザーに更新が完了したことを通知できるようにします。ASP.NET MVCを使用して適切なアクションをフォームに送信

ユーザーが更新ボタンをクリックした後にJQueryダイアログを表示したかったので、JQueryを使用してフォームを送信したかったのです。しかし、私の問題はこれです:

私は簡単に私のコントローラ上のアクションを呼び出すためにJQueryを取得することができますが、私は自分のルートに既に設定したアクションを呼び出すことができず、例えば[Authorize][AcceptVerbs(HttpVerbs.Post)]

、ユーザーは次のURLでそのエンティティを更新している場合:

/SomeController/Edit/5 

jQueryのフォームを送信すると、私はすでに装飾され、受諾された私の編集アクションに提出したいですパラメータとしてのID。次のように私は、フォームを投稿するために使用しています

jQueryのは、次のとおりです。

$("#formFoo").submit(function() { 
       var frm = $("#formFoo"); 
       var action = frm.attr("action"); 
       var serializedForm = frm.serialize(); 
       $.post(action, serializedForm, function() { 
        alert('Call completed'); 
       }); 
       return false; 
      }); 

次のように私は自分のフォームを定義する場合:

<form id="formFoo" action="/SomeController/SomeOtherAction" method="post"> 

、私の行動を次のように:

public void SomeOtherAction() 
{ 
    var myEntity=new MyEntity(); 
    UpdateModel(myEntity); 
} 

私のアクションが呼び出され、オブジェクトには適切な値が設定されていますが、IDフィールドに値が設定されていないため、何がわかりませんエンティティを更新しています。

私は自分のフォームを変更した場合:

<form id="formFoo" action="/SomeController/Edit" method="post"> 

として、私は私の編集アクションが定義されています:

[Authorize,AcceptVerbs(HttpVerbs.Post)] 
public void Edit(int id, FormCollection collection) 

その後、私の行動は決してjQueryので呼び出されていないようにみえます。

私は何とかクエリーストリングからIDパラメータを取り出して、フォームにポストバックしているデータにそのデータを埋め込むことができますが、それは非常に醜いようです。または、SomeOtherActionアクション中にIDフィールドを取得する方法はありますか?それとも私はこのすべてについて間違っているのだろうか?

$.post(action 

を次に "アクション" の引数がIDを含める必要があります:あなたが呼び出す

答えて

3

。あなたの質問では、これは実行時に何か言っていないが、私は強くそれがIDを含まないと思われる。編集アクションのサンプルURIに基づいて、IDはクエリのURIではなくURIのパスに存在する必要があります。デフォルトのMVCルートでは違いはありませんが、あなたのルートがわからなければ、あなたが質問で与えたURIフォーマットに密接に従うべきだと言います。

Firebugをまだインストールしていない場合は、JavaScriptにブレークポイントを設定し、アクション引数の値を調べます。

でも正しいと思われる場合は、FirebugのNetパネルを開き、XHRオプションをクリックして、コードで生成された実際のURIを確認します。それが正しいことを確認してください。URIが正しくない場合は、ルートを確認し、このURIが正しいアクションに正しくルーティングされるようにしてください。

最後に、私はjQuery Ajax Form plug-inのためのプラグインです。私はそれがこの種のものを非常に簡単にすることがわかります。

+0

私は、このようなまぬけです。もちろん!私は自分のフォームのAction属性にIDフィールドを追加するだけです。ヘッドアップをありがとう!私はそれを試み、それはうまくいった。 –

1

これには2通りの方法があります。

FormCollectionを使用するか、エンティティを使用できます。

FormCollectionサンプル:

  • コントローラエンティティと

    public ActionResult ProductEditHandle(int? productID, FormCollection formCollection) 
    { 
        Product product = null; 
    
    if (productID.HasValue) 
        product = ProductEditUpdateModel(productID.Value, formCollection); 
    
    return View("ProductEdit", product); 
    } 
    
  • ビュー

    <% using (Html.BeginForm("ProductEditHandle", "Product", new { productID = 5 })) { %> 
    ...... 
    <% } %> 
    

サンプル:

  • コントローラ

    public ActionResult AddressTypeHandler(AddressTypeDto addressTypeDto) 
    { 
        var addressType = addressTypeDto.AddressTypeId > 0 ? _addressService.UpdateAddressType(addressTypeDto) : _addressService.CreateAddressType(addressTypeDto); 
    
    return RedirectToAction("AddressTypeEdit", new { addressTypeId = addressType.AddressTypeId }); 
    } 
    
  • ビュー(ビュービューページで宣言された - AddressTypeDto)

    <% using (Html.BeginForm("AddressTypeHandler", "People")) { %> 
    
    <%= Html.Hidden("AddressTypeDto.AddressTypeId", (ViewData.Model != null) ? ViewData.Model.AddressTypeId : 0) %> 
    <%=Html.TextBox("AddressTypeDto.Name", ViewData.Model != null ? ViewData.Model.Name : string.Empty, new { size = 50 })%> 
    <% } %> 
    
関連する問題