2012-02-14 5 views
0

ユーザーは、IDEに付属のAspNetSqlProfileProviderを使用して、自分のサイトのどこかにプロファイル情報を記入させていただきました。@ Html.EditorForModel()を使用してフォームを構築するときに、特定のフィールドを自動入力する方法はありますか?

私は自分のプロフィールを編集するためのフォームが自動的に入力される「プロフィールの編集」ページにアクセスして、いつでも自分のプロフィールを編集することができます。私は現在のビューに私のコントローラから(例えば住所、市)は、ユーザーのプロファイルの個々の部分を送信するためにViewBagを使用してこれを実行します。

コントローラーを取得:

ViewBag.address = CustomProfile.GetUserProfile(User.Identity.Name).Address; 
ViewBag.city = CustomProfile.GetUserProfile(User.Identity.Name).City; 

ビュー:

<div class="editor-field"> 
     @Html.TextBox("Address", (string)ViewBag.address) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("City", (string)ViewBag.city) 
    </div> 

ポストコントローラー:

public ActionResult ChangeProfile(FormCollection favorites) 
    { 
     CustomProfile profile = CustomProfile.GetUserProfile(); 
     profile.Address = favorites["Address"]; 
     profile.City = favorites["City"]; 
     profile.Save(); 
     return RedirectToAction("Profile"); 
    } 

上記の編集プロファイルのために正常に動作し、私のユーザの視点からは非常にスムーズです(オンラインで質問/回答を読むことから、ViewModelを使用する必要があります。どのように移行するのかが正確ではない - 失敗しています)。

私のユーザーがウェブサイト(買い物をしていた)から「チェックアウト」に行くと、購入を可能にする最終的な情報を入力できる画面が表示されます。これを「注文ページ」と呼ぶことにします。これらの詳細には、名前、住所、クレジットカード情報などが含まれます。これらの情報の一部は、ウェブサイトのプロフィールページ内の情報と同じです。

フィールドの一部を空白のままにして、この注文ページ(名前、住所)の詳細の一部を自動入力できるようにしたい(クレジットカード - 訪問するたびにこれらの詳細を記入する必要がある注文ページ)。

注文ページの仕組みはMVC Store Tutorial describesです。

素晴らしいですし、あなたが(名前が必要な受注モデル内で指定された詳細を編集し、データ検証のものを可能にすることができます
@Html.EditorForModel() 

、アドレスが必要とされています注文ページが表示された場合には、使用してフォームを表示しますクレジットカードは数字でなければなりません、電子メールは適切にフォーマットされていますなど)、この注文ページ内の特定のフィールドにユーザーのプロフィールから詳細を入力する方法がわかりません。

プロファイルに含まれる情報だけを使用する新しいViewModelを構築しようとしましたが、私が望む最終結果を得られないために必要なものを明確に把握していません。

私はプロファイル情報としてオーダー・モデルだけを使用することを検討しましたが、両方で異なる情報を使用したいので十分ではありません。

プロファイル情報をオーダーモデルとして使用することを検討しましたが、実際に注文するために使用する情報とは別にプロファイル情報を柔軟に保存できるようにしたいと考えています。

「@ Html.EditorForModel()」を使用しているときに特定のフィールドを自動入力する方法を教えてください。

私の全体的な状況に関するその他の助けがあれば、私の流れを簡素化するアドバイスは非常にオープンです(私は自分が必要以上に困難になっていると感じています。コラボレーションは新鮮な空気の息吹のように感じる)。

答えて

3

私はあなたの質問の最初の半分だけを追跡することができました。それはあなたが私があなたを助けることができるコードとコードを示しているものです。後半は私のために完全なミストだった。

ビューをデザインするときは、このビューで表示/編集する必要があるフィールドを考えます。そして、それのためのビューモデル設計:

public class ChangeProfileViewModel 
{ 
    [Required] 
    public string Address { get; set; } 

    [Required] 
    public string City { get; set; } 
} 

をして、このビューは、ビューモデルを移入レンダリングすることになっているあなたのGETのコントローラのアクションがあります。そして、あなたがなり、対応するビューをデザイン

public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    ChangeProfileViewModel model = new ChangeProfileViewModel 
    { 
     Address = profile.Address, 
     City = profile.City 
    }; 
    return View(model); 
} 

@model ChangeProfileViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <button type="submit">OK</button> 
} 

、最終的にこのフォームの提出を処理するPOSTのコントローラのアクションを持っている:

強く、このビューモデルに入力されました
[HttpPost] 
public ActionResult ChangeProfile(ChangeProfileViewModel model) 
{ 
    if (!Model.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     return View(model); 
    } 

    // validation succeeded => process the results 
    CustomProfile profile = CustomProfile.GetUserProfile(); 
    profile.Address = model.Address; 
    profile.City = model.City; 
    profile.Save(); 
    return RedirectToAction("Profile"); 
} 

は、今、私たちがここで観察するものを私たちのGETとPOSTアクションの両方で我々はドメインモデル(CustomProfile)と私たちのビューモデル(ChangeProfileViewModel)との間に繰り返しマッピングコードを持っているということです。この問題を解決するには、AutoMapperを使用することをお勧めします。

public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    ChangeProfileViewModel model = Mapper.Map<CustomProfile, ChangeProfileViewModel>(profile); 
    return View(model); 
} 

または偶数カスタムアクションフィルタで:

[AutoMap(typeof(CustomProfile), typeof(ChangeProfileViewModel))] 
public ActionResult ChangeProfile() 
{ 
    CustomProfile profile = CustomProfile.GetUserProfile(User.Identity.Name); 
    return View(profile); 
} 

とあなたのPOSTアクションに:それはへのあなたのGETアクションを簡素化することができビューについて知っておくことが重要です何

[HttpPost] 
public ActionResult ChangeProfile(ChangeProfileViewModel model) 
{ 
    if (!Model.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     return View(model); 
    } 

    // validation succeeded => process the results 
    CustomProfile profile = CustomProfile.GetUserProfile(); 
    Mapper.Map<ChangeProfileViewModel, CustomProfile>(model, profile); 
    profile.Save(); 
    return RedirectToAction("Profile"); 
} 

モデルでは、各ビューで常にそれらを使用し、このビューで処理する必要がある特定の情報のみが含まれるように設計する必要があります。マッピングエンティティは、ドメインエンティティとビューモデルの間の変換を処理します。

+0

クイック返信ありがとうございます。私はこの時間に眠りますので、朝に試してみる必要がありますが、ViewModelsのより豊かなビューを私に与えてくれたようです。 私の元の郵便内での理解の欠如に関して、私は2つのセッション(長い電話を受けた後の1つ)でこれを書いた。これはおそらく私の畑を通っており、私は改訂するかもしれない。 あなたが私に何を提供したかに焦点を当てる時間が増えたら、私は更新します。 – Ecnalyr

+0

フィールドを正しく自動入力できました。ありがとうございました。しかし、AutoMapperを2つのモデル間でマッピングすることができませんでした(「例外」を投げました)。もう一度ありがとうございます。 – Ecnalyr

関連する問題