我的表单有两个提交按钮用于两个决定。它应该是一种还是两种?
问题描述:
我想知道我的用户选择哪个决定。我的表单有两个提交按钮用于两个决定。它应该是一种还是两种?
方法1
HTML
<form method="post">
<input type="submit" value="Accept" name="decision" />
<input type="submit" value="Decline" name="decision" />
</form>
VB.NET
If Decision = "Accept" Then
' Do this
ElseIf Decision = "Decline" Then
' Do that
End If
方法2
HTML
<form method="post">
<input type="hidden" name="decision" value="true" />
<input type="submit" value="Accept" />
</form>
<form method="post">
<input type="hidden" name="decision" value="false" />
<input type="submit" value="Decline" />
</form>
VB.NET
If Decision Then
' Do this
Else
' Do that
End If
有什么真正的区别?你会去哪,为什么?
答
两个都是有效的,但我会亲自去第一个。
我这样做的原因是标记稍微干净一些。表格的目的是供用户作出决定,这些元素IMO应该组合在一起,例如称为frmDecision
的表格。
第二个原因是在第二个例子中的代码是ambigious。
例如,在后面
If Decision Then
的代码读取如果判决等于真实的,那必要不表明Accept
或Decline
。同时将一个参数传递回名为Decision的服务器,其值为true或false,这是一个小小的缺陷。
我发现第一个例子更清洁,虽然你可以使用资源文件,所以你不必使用魔法字符串。
答
案例#1不可扩展。当选择的数量会增加时,将很难管理。而不是干净的行动之间的分离,这可能是有用的,当你通过AJAX调用它们。案例#2是多余的。我更喜欢第三种方式。起初,我有名字选择属性(我从C#转换,所以不能确定其工作正常):
Imports System
Imports System.Web
Imports System.Web.Mvc
Imports System.Reflection
Namespace MySpace
<AttributeUsage(AttributeTargets.Method, AllowMultiple := False, Inherited := True)> _
Public Class SubmitActionAttribute
Inherits System.Web.Mvc.ActionNameSelectorAttribute
#Region "-- Constants -----------------------------------------------------------------------"
Friend Const ACTION_PREFIX As String = "action:"
Private Const ROUTE_ACTION As String = "action"
#End Region
Private _Name As String = Nothing
Public ReadOnly Property Name() As String
Get
Return _Name
End Get
End Property
Public Overrides Function IsValidName(controllerContext As ControllerContext, actionName As String, methodInfo As MethodInfo) As Boolean
Dim name As String = If(_Name, methodInfo.Name)
Dim key As String = String.Concat(SubmitActionAttribute.ACTION_PREFIX, name)
Dim value As ValueProviderResult = controllerContext.Controller.ValueProvider.GetValue(key)
If value IsNot Nothing Then
controllerContext.RouteData.Values(SubmitActionAttribute.ROUTE_ACTION) = name
Return True
End If
Return False
End Function
Public Sub New(name As String)
_Name = name
End Sub
Public Sub New()
End Sub
End Class
End Namespace
然后我这个属性添加到控制器的动作
<SubmitAction("Accept")> _
Public Function AcceptSmth() As ActionResult
End Function
而在HTML中使用:
<input type="submit" value="Any value for caption" name="action:Accept" />
答
我会去的第一个。您提供的VB代码应该看起来更像这个
Private Sub Accept_Click(sender As Object, e As EventArgs) Handles Accept.Click
'do this
End Sub
Private Sub Decline_Click(sender As Object, e As EventArgs) Handles Decline.Click
'do that
End Sub
,或者如果有两个
Private Sub Accept_Click(sender As Object, e As EventArgs) Handles Accept.Click
doThisOrThat(True)
End Sub
Private Sub Decline_Click(sender As Object, e As EventArgs) Handles Decline.Click
doThisOrThat(False)
End Sub
Private Sub doThisOrThat(decision As Boolean)
If decision Then
'do this
Else
'do that
End If
End Sub
之间的公共代码,这是一个VB的解决方案而不是C#。其次,我相信你提供的解决方案对于将价值传递回服务器的情况是过分的。 – 2013-04-06 17:20:01
我同意达伦在所有方面。 – dbasnett 2013-04-06 17:26:51
我希望这不是一个问题,翻译C#到VB,有很多转换器可用(f.e. http://converter.telerik.com/)。至于矫枉过正 - 我没有得到,你在哪里找到它?这与ValueProvider中的对名称+值与样本#1中的值相同,但对AJAX调用f.e.更有效得多。你可以调用接受/拒绝行为,而不是一个复杂的行为,里面有很多条件,向它传递多余的选项(比如“决定”)等。我希望你明白可能有两个以上的选择和情况#1成为... – Stan 2013-04-06 17:34:30