处理模型属性MVC4 ASP.NET中的动态内容

时间:2012-08-01 19:35:05

标签: c# asp.net-mvc

我将html存储在我的数据库中的JSON blob中,该数据库在C#中反序列化为动态ViewCargo。在视图级别,我然后使用@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);

由于我有一个处理几十个视图的视图加载的中央控制器,我想避免用这样的代码堵塞我的控制器方法。还有什么我可以做的吗?

1 个答案:

答案 0 :(得分: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>

这样,您就可以链接到路由操作而不是硬编码网址。如果您以不同方式重构路线,则链接不会中断。