1

IDEに付属のAspNetSqlProfileProviderを使用して、ユーザーにサイトのどこかにプロファイル情報を入力してもらいます。

プロファイルを編集するためのフォームが自動入力されるプロファイルの編集ページに移動することで、ユーザーがいつでもプロファイルを編集できるようにします。私は現在、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を使用する必要があるように見えますが、移行方法が正確にはわかりません-失敗しています)。

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

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

注文ページの仕組みは、MVCストアチュートリアルで説明されているとおりです。注文ページが表示されると、以下を使用してフォームが表示されます。

@Html.EditorForModel()

これは素晴らしいですし、注文モデル内で指定された詳細を編集でき、データ検証のもの(名前が必要、住所が必要、クレジットカードは番号である必要があり、電子メールは適切にフォーマットされているなど)が可能になりますが、私はできませんこの注文ページ内の特定のフィールドにユーザーのプロファイルの詳細を入力する方法を理解してください。

プロファイルに含まれている情報だけを使用する新しいViewModelを作成しようとしましたが、希望する最終結果が得られないため、何が必要かを明確に把握できていません。

プロファイル情報として注文モデルのみを使用することを検討しましたが、両方で異なる情報を利用できるようにしたいので、それだけでは不十分です。

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

問題を解決するために具体的に知っておく必要があるのは、「@ Html.EditorForModel()」を使用しているときに特定のフィールドに自動入力する方法です。

私の全体的な状況に関する他の助けは素晴らしいでしょう、私は私の流れを単純化するアドバイスを非常に受け入れています(私は必要以上に自分自身を難しくしているように感じます、そして私はコラボレーションが次のように感じるポイントにいます新鮮な空気の息吹)。

4

1 に答える 1

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の使用をお勧めします。GETアクションを次のように簡略化できます。

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アクションは:

[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");
}

ビューモデルについて知っておくべき重要なことは、ビューごとに常にそれらを使用し、このビューが処理する必要のある特定の情報のみが含まれるように設計する必要があるということです。ドメインエンティティとビューモデル間の変換は、マッピングレイヤーに任せてください。

于 2012-02-14T21:39:40.517 に答える