2011-07-19 13 views
0

私のエリア登録でこれら2つのルートを区別するにはどうすればいいですか?フォームが正しいコントローラアクションに投稿されないのはなぜですか?

これは、そのエリア登録の最後の2つのルートです。

最初のルートは、ビューが読み込まれるときです。正常に動作します。

最初のルートがフォームをロードし、その後同じコントローラに送信されますが、異なるアクションが送信されます。

コントローラからは決してOKです。ルーティングの問題のためにコントローラに当たっていない可能性があります。

私には何が欠けていますか?

context.MapRoute(
     "Load", 
     "app/respond/{Id}", 
     new { controller = "Controller1", action = "Index" } 
    ); 

    context.MapRoute(
     "Update", 
     "app/respond/{action}", 
     new { controller = "Controller1", action = "Update" } 
    ); 

これは、フォームがどのように見えるかです:

@using (Html.BeginForm("Update", "Respond", FormMethod.Post, new { id = "frmUpdate" })) 
{ 
    //all form fields go here 
} 

これは、投稿がどのように行われるかである。

$('#frmUpdate').submit(function() { 
    //verify all field values 

    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function (result) { 
      if (result.s == 'OK') 
       alert("Success! Response updated"); 
      else 
       alert("Sorry! Update failed.");//this is what I get 
     } 
    }); 

    return false; 
}); 

マイコントローラー:

[HttpPost] 
public ActionResult Update(MyModel model) 
{ 
    return Json(new { s = "OK", m = "Hi from controller" }); 
} 

答えて

1

あなたがすることはできませんそれらの2つのルートを区別するために、彼らは絶対にt彼は同じURLパターンapp/respond/somethingです。 somethingに制約を設定していないので、最初のルートが常に一致します。

あなたは、ルーティングシステムは、区別のできることのチャンスを持っているしたい場合は、あなたがのは{id}は数字のみを含まなければならないことを言わせて、たとえば、制約を使用する必要があります。

context.MapRoute(
    "Load", 
    "app/respond/{id}", 
    new { controller = "Controller1", action = "Index" }, 
    new { id = @"[0-9]+" } 
); 

context.MapRoute(
    "Update", 
    "app/respond/{action}", 
    new { controller = "Controller1", action = "Update" } 
); 

今、あなたはapp/respond/123を要求したときインデックスアクションが呼び出され、app/respond/FooBarを呼び出すと、FooBarアクションが呼び出されます。 app/respondを要求すると、Updateアクションが呼び出されます。

+0

私のケースでは、両方のケースが全く同じURLを持っていますが、私はアクションのために異なる値を持っています。 2番目のルートは同じURLであるため、同じIDを持つため、idに制約を追加できません。フォームの送信後に同じページにユーザーを置いているためです。私はユーザーの結果を非同期的に表示します。 – kheya

+0

提出されたフォームを読み込みます。提出すると、私はDBアクションをいくつか行い、その結果をユーザーに表示しないようにしたい。これは、jqueryを使用して非同期で行われます。ロードするアクションは、更新するアクションとは異なります。私はそれを正しくしていますか? – kheya

+0

@Projapati、あなたの現在のルート設定では、あなたはそれを正しくやっていないルート制約なし。 –

関連する問題