2016-04-17 28 views
1

を使用して一つに作成と編集ActionResultsマージ私は現在、4つのアクションメソッドがあります:ASP.NET MVC

UserCreateを -
UserCreateを取得 - 投稿

UserEdit -
UserEditを取得 - 投稿

私の目標は、どういうわけかそれらを結合することだけですUserEdit。この2つの唯一の違いは、UserCreateがパスワードとConfirmPasswordをフォームに要求することです。 UserEditはありません。私はこのために2つの別々のViewModelを作成する必要がありました:UserCreateViewModel、UserEditViewModel。

// GET: Users/Create 
[Route("users/create")] 
public IActionResult UserCreate() 
{ 
    return View(); 
} 

// POST: Users/Create 
[Route("users/create")] 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> UserCreate(UserCreateViewModel vm) 
{   
} 

// GET: Users/Edit/5 
[Route("users/edit/{id}")] 
public async Task<IActionResult> UserEdit(string id) 
{ 
    return View(vm); 
} 

// POST: Users/Edit/5 
[Route("users/edit/{id}")] 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> UserEdit(UserEditViewModel vm) 
{ 
    return View(vm); 
} 

分離それらを保つことは結構です、より良い、よりMVC大会ですが、私はちょうどMVCのいくつかの機能は、私はそれを利用しておりませんということがないことを確認したい、私は唯一の2アクションメソッドを持って助けることができる場合、これに対する1つのビューモデル。

答えて

3

別々に保管してください。あなたはMVCの中で、これを「周りに」働くことを目的とした何かが欠けているわけではありません。確かにあなたはそれを動作させることができますが、それは彼らが似たような行動であると考えるために共通のAPIの実装から逸脱します。それが本当に悪いと感じるなら、同じビューモデルとコードバリデーションをページとサーバー側で使用することができます(1つのモデルに対して2つのシナリオが必要なので、モデルに依存することはできませんでした)。二。清潔です。

+0

これが完成しました!今はすべて私にとって意味があります。私はUserEditと呼ばれる1つのGET関数を作成し、IDを作ったと言うことができますか?オプション。 VMにIsNewという名前のプロパティを追加して、単にパスワードとパスワードの確認フィールドを表示するかどうかをチェックすることができます。ここで問題となっているのは、自分のVMで[必須]注釈がPasswordとConfirmPasswordの上にあるため、ユーザーがModelState.IsValidを編集している状況でPOSTで失敗するということです。理にかなっている?ちょうど私が2つの別々のVMで分かれている可能性が高いにもかかわらず、私がこれをよく理解していることを確認したいのです。 –

+0

最後のアプローチは、2つの別々のViewModelと2つの別々の関数です。私は実際にフォームが似ているので、単一のViewModelしか持たない方法を見つけようとしていましたが、あなたが言っていたように検証は私を駄目にしています。 –

+1

yes.asはそれを別のものにしておくと言っています。それはちょうどうんざりしています。チェックのための余分なロジックを書く必要があります。常に固体の原則に従います。 –

0

はい、あなたは確かにだけMVC機能を使用して2methods持つことができます。

あなたはPOSTタイプのためのメソッドを作成することができますGETタイプのため

[HttpGet] 
[Route("users/useraddoredit/{id?}")] 
public async Task<IActionResult> UserEdit(string id) 
{ 
    if(string.isNullorEmpty(id)) 
    { 
    return View(); 
    } 
    return View(vm); 
} 

を作成するための方法または編集するユーザーを作成することができます。ここではすべての属性を持つ新しいモデルのUserViewModelを作成します。

[Route("users/edit/{id}/{isUserEdit?}")] 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> UserEdit(UserViewModel vm, bool isUserEdit) 
{ 
    if(isUserEdit) 
    { 
     return View(vm); 
    }  
    else 
    { 
     //logic for add user 
    } 
} 

PS:ただし、この方法を使用することはお勧めしません。

+0

PS:しかし、このアプローチを使用することはお勧めしません。どのようなアプローチですか?あなたが今説明したこと全部?それでも2つのビューモデルが必要ですか?作成フォームを表示するフォームと、編集フォームを表示するフォーム –

+1

yes.asはそれを別のものにしておいたと言っています。チェックするために余分なロジックを書く必要があります。常に固体の原則に従います。 –

+0

私はそれを手に入れます。もし私が本当にしたいと思えば、私はそれをどのように組み合わせるかを私に見せてくれてありがとう。私はオプションのパラメータについて知ってうれしいです。 –