2013-04-06 92 views
1

我想知道我的用户选择哪个决定。我的表单有两个提交按钮用于两个决定。它应该是一种还是两种?

方法1

Method 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

Method 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 

有什么真正的区别?你会去哪,为什么?

回答

1

两个都是有效的,但我会亲自去第一个。

我这样做的原因是标记稍微干净一些。表格的目的是供用户作出决定,这些元素IMO应该组合在一起,例如称为frmDecision的表格。

第二个原因是在第二个例子中的代码是ambigious。

例如,在后面

If Decision Then 

的代码读取如果判决等于真实的,那必要不表明AcceptDecline。同时将一个参数传递回名为Decision的服务器,其值为true或false,这是一个小小的缺陷。

我发现第一个例子更清洁,虽然你可以使用资源文件,所以你不必使用魔法字符串。

0

案例#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" /> 
+0

之间的公共代码,这是一个VB的解决方案而不是C#。其次,我相信你提供的解决方案对于将价值传递回服务器的情况是过分的。 – 2013-04-06 17:20:01

+0

我同意达伦在所有方面。 – dbasnett 2013-04-06 17:26:51

+0

我希望这不是一个问题,翻译C#到VB,有很多转换器可用(f.e. http://converter.telerik.com/)。至于矫枉过正 - 我没有得到,你在哪里找到它?这与ValueProvider中的对名称+值与样本#1中的值相同,但对AJAX调用f.e.更有效得多。你可以调用接受/拒绝行为,而不是一个复杂的行为,里面有很多条件,向它传递多余的选项(比如“决定”)等。我希望你明白可能有两个以上的选择和情况#1成为... – Stan 2013-04-06 17:34:30

0

我会去的第一个。您提供的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 
相关问题