2009-06-20 9 views
0

ヘッダーがわかりにくいことは知っていますが、問題の記述方法は正確には分かりませんでしたが、ここではそれがあります。ASP.NET MVCサイトでサブクラスの入力を行うための最良の方法

私はこのドメインエンティティを持っています:ユーザは、ユーザが複数のアドレスを持つことができるので、サブクラスのアドレスのリストを持っています。家、仕事など...

private class User{ 
    private string _FirstName; 
    private string _LastName; 
    private IList<Address> _addresses; 

    public string FirstName{...} 
    public string LastName{...} 
    public IList<Addresses> Addresses {...} 
} 

private class Address{ 
    private string _streetAddress1; 
    private string _streetAddress2; 
    ... 

    public string StreetAddress1{...}; 
    public string StreetAddress2{...}; 
    ... 
} 

私はこのような入力データの検証を持っています。

[AcceptVerbs(HttpVerbs.Post)] 
[ValidateModelAttribute(typeof(FormUser))] 
public ActionResult CreateEdit([Bind(Prefix = "")] FormUser formUser) 
{ 
    //-- Check so the input 
    if (!ModelState.IsValid) 
     return View(); 

    User modelUser = new UserMapper().MapToModel(formUser); 
    _UserRepository.Save(modelUser); 

    return RedirectToAction<SharedController>(m => m.Success()); 
} 

FormUserは、このように見える私のPresentationEntityです。

public class FormUser 
{ 
    [NonEmptyValidator("Field is required!")] 
    public string FirstName{get;set;} 
    [NonEmptyValidator("Field is required!")]  
    public string LastName{get;set;} 

    public List<Address> Addresses{get;set;} 
} 

FirstNameとLastNameのフィールドには問題はありませんが、これは問題なく、とても簡単です。しかし、私はUserエンティティにAddressesプロパティを追加しました。このエンティティをAddressエンティティの入力フィールドを簡単に検証できるようにスマートな方法で入力します。

私のWebページにはFirstNameとLastNameのテキストボックスがあり、今はこのユーザーのアドレスを追加したいとします。私はこれを行う方法を見ることができます

それは私がユーザーに対して行うのと同じ検証を行う独自のコントローラを持つ新しいWebページを開くことです。だから、私はFormAddressクラスとCreateEdit()メソッドを自分のAddressControllerに持っています。私がここに見る問題は、データの検証が終了したら、このアドレスデータをユーザーに追加する方法です。

これを行うより良い方法がありますか?ステートフルなアプリケーションでは本当に簡単ですが、ここではそれを行うためのきれいな方法はありません。

答えて

0

ビュー上のフォームには、ユーザーとアドレスのフィールドを含めることができます。このフォームをユーザーとアドレスを必要とする単一のActionResultに移動させます。フレームワークは、(クラスプロパティと同じ名前のフォームフィールドに名前をつけている限り)フォームからフィールドをドメインモデルクラスのプロパティにマップします。

public ActionResult CreateEdit(User user, Address address) 

{ 
//validate the user and the address here (how is up to you) 

//add the user 

//add the address to the user 

//save to the db 
} 

ここで、ActionResultでは、UserオブジェクトとAddressオブジェクトの検証を個別に実行できます。

+0

問題は、ユーザーが複数のアドレスを持つことができるため、アドレスデータを入力するための別個のページが必要なことです。それは、アドレスだけではなくユーザーに関する情報がはるかに多いからです。異なる電話番号があります。他のユーザーオブジェクトやその他の情報への参照が多いので、「ユーザーページ」をできるだけシンプルに保つ必要があります私たちが必要なときに表示/非表示できる別の入力フォーム。また、すべてのデータがすべての時点で供給されないため、すべての部分で有効性が確認されているため、毎回すべてを検証することはできません。 –

+0

フォームの表示/非表示はどうですか? 1つの方法は、各エリアが独自の視点を持つタブを経由することです。この方法では作業が簡単になりますが、ロードされた各タブのサーバーへのラウンドトリップが発生します。また、JQueryを使用して、アドレスフォーム(電話など)でポップアップウィンドウを開くこともできます。各フォームは、個別のコントローラアクションを指すフォームアクションを持つ独自のフォームタグを持つ必要があります。さらに、Jqueryのアコーディオンやタブでも同じことができます。また、フォームをネストしないでください。ネストされたフォームは許可されません。 – mikerennick

関連する問題