2011-01-15 6 views
4

を含むと、私はビューを表示するには、[編集] GETメソッド、および変更を保存し、編集POSTメソッドを持っているエラー:するViewResultとのActionResultが私のコントローラで同じパラメータ

public ViewResult Edit(int id) 
{ 
    // 
} 

[HttpPost] 
public ActionResult Edit(int id) 
{ 
    // 
} 

しかし、私はエラーを取得しています言って:

タイプ「Controllers.MyController」は既に同じパラメータ型私はこの問題を回避するにはどうすればよい

で「編集」と呼ばれるメンバーが定義されて?

答えて

5

あなたは、ビューモデルを実装することができます。

[HttpGet] 
public ViewResult Edit(int id) 
{ 
    //build and populate view model 
    var viewModel = new EditViewModel(); 
    viewModel.Id = id; 
    viewModel.Name = //go off to populate fields 

    return View("", viewModel) 
} 

[HttpPost] 
public ActionResult Edit(EditViewModel viewModel) 
{ 
    //use data from viewModel and save in database 
} 

だから、あなたのGETとPOSTメソッドが異なるシグネチャを持っているでしょう。そして、それはあなたのPOSTメソッドであなたは少しのように、パラメータとしてEditViewModelを渡すことを意味します。お役に立てれば。

1

これは、同じパラメータを両方の関数に渡しているためです。これは、HttpPostを指定しても許可されていません。編集ポスト関数の名前を変更してHtml.BeginForm()で指定するか、またはパラメータをintではなくFormCollectionに変更することができます

3

関数のオーバーロードについては、この(3.6 Signatures and overloading)を読む必要があります。あなたは同じname.But で各機能を二つ以上の機能を有することができる。このアプローチでは

の過負荷を

機能 パラメータ、パラメータの順序や の異なる 署名(すなわち、異なる種類を持っている必要がありますパラメータの数)。

注:戻り値の型があなたにも同じ名前とシグネチャとの両方の機能を実装しているあなたのコードでは、パラメータ

の署名ではありません。あなたは、ユーザーの望むすべてのフィールドを含むEditViewModelを編集し、編集GETメソッドでこれを返すことができなければならないとビューモデルに強く型付けされたビューを持っているので、

2

別の、あまりエレガントなソリューションでは、「ウィザードのような」ページ構造のビュー(ページ1からページ2、ページ2からページ3へのViewModelを渡すなど)を想像してください。

問題は、2ページの「GET」バージョンは、1ページからモデルを受信する必要があるが、また、ポストバックをやったときにページ3にモデルを渡す必要があるということです。したがって、「中間」ページのGETとPOSTの両方のバージョンでは、モデルを含む署名が必要です。

この問題を回避するには、それが使用してNULL可能であることを確認して作り、単に署名に「ジャンクパラメータ」を追加するのですか?。

[HttpGet] 
    public ActionResult Page2(MyModel myModel) 
    { 
    } 

    [HttpPost] 
    public ActionResult Page2(MyModel myModel, int? i) 
    { 
    } 
0

私はこれを行う最も簡単な方法は、global.asax.csファイルに追加のオプションのパラメータを追加していると思う:

new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional } // Parameter defaults 

[HttpPost] 
public ActionResult Edit(int id) 

から

にあなたの第2の機能を変更します
[HttpPost] 
public ActionResult Edit(int id, int id2) 

この方法で、ロジックを変更する必要はありません。 2番目のパラメータはオプションです。あなたが価値を提供しなければ、それは文句を言わない。

0

POSTコントローラメソッドでビューモデルを使用する場合は、モデルに空のコンストラクタがあることを確認してください。これは私にナッツを運転していた。

namespace app.Models 
{ 
    public class UserEdit 
    { 
     public User User { get; set; } 

     public UserEdit() { } 
    } 
} 
0

代わりにこれを試すことができます。

public ActionResult Edit() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ActionName("Edit")] 
    public ActionResult EditPosted() 
    { 
     return View(); 
    }