2010-12-01 55 views
3

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

对于这个项目,我们使用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 

回答

1

对我来说,我更喜欢选项1.在助手上进行逻辑更加方便,并且更加优雅。

+0

而你保持DRY不会重复if/else在任何你想呈现链接 – 2010-12-01 11:05:40

1

我会strogly建议/使用选项1 - 不论意见数量的您正在开发

  • 让你的看法哑。 - 对于单个视图或100个视图无关紧要。
1

对方案1的大量支持 - 然后 - 玩恶魔的拥护者的时间!

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

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

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

  • 这就是假设它是我正在做出改变。如果我要求我的标记专家将链接更改为图像,或者向a元素添加一个类来设置它的样式,该怎么办?他非常高兴编辑视图文件,但是如果他看到助手呼叫,他不知道HTML来自哪里以及在哪里更改它。即使他发现助手类他会知道如何改变C#代码来做他需要的吗?他所要做的就是改变一些文字!为什么它必须如此困难?

  • 我可以通过在助手上添加两个方法参数并为每个链接传递文本来缓解上述问题,但是如果文本是图像标记呢?现在我已经获得了需要在帮助者电话中转义的HTML - 这看起来很杂乱。我仍然无法编辑链接元素的属性,我是否也应该添加一个参数/参数?它停在哪里?

实质上我会说我可以向大多数人展示选项2,他们会理解它并能够修改它。很简单的HTML与一些易于遵循的条件逻辑。选项1增加了我不需要的复杂性和抽象。

+0

非常好的论点。 @nick提到他将在仅有一页上使用此链接。所以点2,3,4 - 不接受。不过,对于明天的option2,如果您将视图引擎更改为Spark或Razor,则纯帮助程序对于singel页面来说是有意义的。 – swapneel 2010-12-01 15:44:02