3

Me and a colleague are discussing how we would generate a link on a page. Should we use html helpers or keep very simple view logic in the view?

For this project we are using Castle Monorail and the NVelocity view engine. I would be grateful to anyone who considers both options below and gives their opinions.

In this story, the link is currently only used on a single page.

Option 1 - With Helper

Helper Code

 var action = snail.IsActive ? "ConfirmDeactivate" : "ConfirmActivate";
   var routeValues = new Dictionary<string, string>
                      {
                       {"action", action},
                       {"querystring", "id=" + snail.ID}
                      };
   var href = UrlHelper.For(routeValues);

   var link = new XElement("a");
   link.SetAttributeValue("href", href);
   link.SetValue(action.Substring(7));

   return link.ToString();

And then in the view, we just call the helper like so:

<li>$Html.SnailActivationSwitchLink($item)</li>

Option 2 - All in the View

#if($snail.IsActive)
  <a href="$Url.For("%{action='ConfirmDeactivate', querystring='id=$snail.ID'}")">Deactivate</a>
  #else
   <a href="$Url.For("%{action='ConfirmActivate', querystring='id=$snail.ID'}")">Activate</a>
  #end
4

3 回答 3

1

我会强烈建议/使用选项 1 - 无论您正在开发的视图数量如何

  • 让你的观点变得愚蠢。- 对于单个视图或 100 个视图都没有关系。
于 2010-12-01T12:22:24.320 回答
1

大量支持选项 1 - 是时候扮演魔鬼的拥护者了!

应用 DRY 等概念的主要原因之一是使应用程序更易于更改/更易于维护。所以:

  • 如果链接中的文本需要稍后更改怎么办?或者我想在里面放一张图片而不是文字?我真的要重建应用程序以删除链接中的错字吗?

  • 更糟糕的是,如果不同页面上的链接文本需要不同怎么办?然后我是否为每个页面添加另一个帮助方法?

  • 假设是我做出了改变。如果我要求我的标记专家更改图像的链接,或者向 a 元素添加一个类以对其进行样式化怎么办?他非常乐意编辑视图文件,但如果他看到助手调用,他将不知道 HTML 来自哪里以及在哪里更改它。即使他找到了帮助类,他会知道如何更改 C# 代码来满足他的需要吗?他想要做的只是改变一点文字!为什么一定要这么难?

  • 我可以通过在帮助程序上添加两个方法参数并为每个链接传递文本来缓解上述一些问题,但是如果文本是图像标签怎么办?我现在有了需要在帮助程序调用中转义的 HTML - 这看起来会很混乱。我仍然无法编辑链接元素的属性,我是否也应该为此添加一个参数/参数?它停在哪里?

本质上,我认为我可以向大多数人展示选项 2,他们会理解并能够修改它。漂亮的纯 HTML,带有一些易于遵循的条件逻辑。选项 1 增加了我不需要的复杂性和抽象性。

于 2010-12-01T14:04:05.123 回答
1

对我来说我更喜欢选项1。在助手上做逻辑更方便,更优雅。

于 2010-12-01T11:03:05.480 回答