MVC逻辑,观点和助手 - 一个特定的故事

时间:2010-12-01 10:54:07

标签: asp.net-mvc model-view-controller castle-monorail

我和一位同事正在讨论如何在页面上生成链接。我们应该使用html助手还是在视图中保持非常简单的视图逻辑?

对于这个项目,我们使用Castle Monorail和NVelocity视图引擎。如果有人考虑下面的两个选项并发表意见,我将不胜感激。

在这个故事中,该链接目前仅用于一个页面。

选项1 - 使用助手

帮助代码

 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();

然后在视图中,我们只是像这样调用帮助器:

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

选项2 - 视图中的全部

#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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我强烈建议/使用选项1 - 无论您正在开发的观看次数是多少

  • 让你的观点变得愚蠢。 - 对于单个视图或100个视图无关紧要。

答案 2 :(得分:1)

当时对选项1的大量支持 - 时间扮演魔鬼的拥护者!

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

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

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

  • 这是假设我正在做出改变。如果我让我的标记专家更改图像的链接,或者将一个类添加到一个元素来设置它,该怎么办?他非常乐意编辑视图文件,但如果他看到帮助程序调用,他就不知道HTML的来源和更改位置。即使他找到了帮助类,他也知道如何改变C#代码来做他需要的东西吗?他所要做的就是改变一些文字!为什么它必须如此困难?

  • 我可以通过在帮助器上添加两个方法参数,并为每个链接传入文本来缓解上述一些问题,但是如果文本是图像标记怎么办?我现在已经得到了我需要在我的助手调用中逃脱的HTML - 这看起来很混乱。我仍然无法编辑链接元素的属性,我是否应该添加参数/参数?它在哪里停止?

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