3

我将 html 存储在我的数据库中的 JSON blob 中,该 blob 反序列化为ViewCargoC# 中的动态 , 。在视图级别,然后我使用类似的东西@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 来自对数据库的调用,该数据库查找用户和促销并确定用户已加入此促销。因此,我想为他们提供一个链接来检索他们现有的卡(而不是发行新卡)。

我考虑过的一件事是在我的 json'd 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。如果您以不同方式重构路线,则链接不会中断。

于 2012-08-01T21:16:35.423 回答