3

ViewCargoC# で動的に逆シリアル化するデータベースの JSON blob 内に html を保存しています。ビュー レベルでは、次のようなものを使用@Model.ViewCargo.PromoDetailsして HTML を出力します。

動的プロパティ内のコンテンツを更新する必要があるシナリオを除いて、これはうまく機能しています。その例として、次のような、ページを読み込んでいるユーザーに基づいて href 属性を設定する必要があるアンカー タグを含む段落タグ内のメッセージがあります。

<p>Thank you for coming back to our promotion! It looks like you have already 
received a promotional card for this promotion! You can click 
<a href="[need to inject URL here]" target="blank">here</a> to retrieve 
your promotional gift card!</p>

この場合、URL は、ユーザーとプロモーションを検索し、ユーザーが既にこのプロモーションに参加していると判断するデータベースへの呼び出しから取得されます。そのため、(新しいカードを発行する代わりに)既存のカードを取得するためのリンクを提供したいと思います。

私が検討したことの 1 つは、json 化された HTML にプレースホルダーを配置し、String.Replace を使用することです。例えば:

string existingUrl = db.UserAlreadySubmitted(userId,promoId);
if(!string.IsNullOrEmpty(existingUrl)) {
    Campaign.ViewCargo.PromoDetails = Campaign.ViewCargo.PromoDetails.Replace("[URLPlaceholder]",existingUrl);
}
return View(Campaign);

私は多数のビューのビューの読み込みを処理する中央コントローラーを持っているので、このようなコードでコントローラー メソッドが詰まるのを避けたいと思います。他にできることはありますか?

4

1 に答える 1

0

リンク URL がデータベースへの呼び出しの結果である場合、実際にはそれらの呼び出しを Controller または ViewModel 内に配置し、Routing を使用して適切な URL を生成する必要があります。

例えば:

モデルを見る

public class PromoViewModel {
    private readonly YourDataSourceType context;

    public PromoViewModel(YourDataSourceType context) {
        this.context = context;
    }

    public int UserId {
        get { // get the user id }
    }

    public int PromoId {
        get { // get the promo id }
    }
}

コントローラ アクション

public ActionResult TheViewName() {
    PromoViewModel model = new PromoViewModel(DatabaseContext);
    return View(model);
}

景色

@model The.Namespace.To.PromoViewModel

<p>Thank you for coming back to our promotion! It looks like you have already 
received a promotional card for this promotion! You can click 
<a href="@Url.RouteUrl(new { controller = "Controller Name", action = "Action Name", userId = Model.UserId, promoId = Model.PromoId })" target="blank">here</a> to retrieve 
your promotional gift card!</p>

そうすれば、ハードコードされた url ではなく、ルーティングされたアクションへのリンクを hrefing します。ルートを別の方法でリファクタリングしても、リンクは壊れません。

于 2012-08-01T21:16:35.423 に答える