我将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);
由于我有一个处理几十个视图的视图加载的中央控制器,我想避免用这样的代码堵塞我的控制器方法。还有什么我可以做的吗?
答案 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>
这样,您就可以链接到路由操作而不是硬编码网址。如果您以不同方式重构路线,则链接不会中断。