我一直在查看Google搜索结果,了解实现某种RadioButton
列表(VB,MVC3,Razor)的方法。不幸的是,我发现的大多数结果都是在C#中;这是我能找到的最有用的参考: Jon Lanceley's MVC3 RadioButton Helper (C#,顺便说一句),所以我需要将代码翻译成VB(谢谢, developerFusion !)。
我认为它会相当直接,但我发现编译器不会将该函数识别为模块命名空间的一部分;随之而来的是一些解决问题的尝试,但都失败了。
这是我的代码(您可以看到我通过评论尝试过的所有尝试,如果Andrew.San
,则使用Ctrl + F
签名):
助手:
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.Mvc
Imports System.Web.Mvc.Html
Imports System.Linq.Expressions
Imports System.Runtime.CompilerServices
Imports System.Text
Namespace RadioButtonListForHelperTest
Public Module HtmlExtensions
Sub New()
End Sub
<Extension()> _
Public Function RadioButtonForSelectList(Of TModel, TProperty)( _
htmlHelper As HtmlHelper(Of TModel), _
expression As Expression(Of Func(Of TModel, TProperty)), _
listOfValues As IEnumerable(Of SelectListItem)) As MvcHtmlString
Dim metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)
Dim stringBuilder = New StringBuilder()
If listOfValues IsNot Nothing Then
' Create a radio button for each item in the list
For Each item As SelectListItem In listOfValues
' Generate an id to be given to the radio button field
Dim id = String.Format("{0}_{1}", metaData.PropertyName, item.Value)
' Create and populate a radio button using the existing html helpers
Dim label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text))
Dim radio = htmlHelper.RadioButtonFor(expression, item.Value, New With { _
Key .id = id _
}).ToHtmlString()
' Create the html string that will be returned to the client
' e.g. <input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" /><label for="TestRadio_1">Line1</label>
stringBuilder.AppendFormat("<div class="RadioButton">{0}{1}</div>", radio, label)
Next
End If
Return MvcHtmlString.Create(stringBuilder.ToString())
End Function
End Module
End Namespace
型号:
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.ComponentModel.DataAnnotations
Imports System.Web.Mvc
Namespace RadioButtonListForHelperTest.Models
Public Class TestModel
Public Property TestRadioList() As IEnumerable(Of SelectListItem)
Get
Return m_TestRadioList
End Get
Set(value As IEnumerable(Of SelectListItem))
m_TestRadioList = value
End Set
End Property
Private m_TestRadioList As IEnumerable(Of SelectListItem)
Public Property TestRadioList2() As IEnumerable(Of SelectListItem)
Get
Return m_TestRadioList2
End Get
Set(value As IEnumerable(Of SelectListItem))
m_TestRadioList2 = value
End Set
End Property
Private m_TestRadioList2 As IEnumerable(Of SelectListItem)
<Display( _
Name:="Test Radio 1", _
Description:="This is the first list.", _
Prompt:="Some prompt message.", _
Order:=2)> _
<Required(ErrorMessage:="You must select an option for TestRadio")> _
Public Property TestRadio() As String
Get
Return m_TestRadio
End Get
Set(value As String)
m_TestRadio = value
End Set
End Property
Private m_TestRadio As String
<Display( _
Name:="Test Radio 2", _
Description:="This is the second list.", _
Prompt:="Some prompt message.", _
Order:=1)> _
<Required(ErrorMessage:="You must select an option for TestRadio2")> _
Public Property TestRadio2() As String
Get
Return m_TestRadio2
End Get
Set(value As String)
m_TestRadio2 = value
End Set
End Property
Private m_TestRadio2 As String
' I tried it out, just in case
' (see Index; @Html.RadioButtonForSelectList).
' It didn't help, really.
' - Andrew.San
Public Function RadioButtonForSelectList(Of TModel, TProperty)( _
htmlHelper As HtmlHelper(Of TModel), _
expression As Expressions.Expression(Of Func(Of TModel, TProperty)), _
listOfValues As IEnumerable(Of SelectListItem)) As MvcHtmlString
Return RadioButtonListForHelperTest.RadioButtonForSelectList(htmlHelper, expression, listOfValues)
End Function
End Class
Public Class aTest
Public Property ID() As Integer
Get
Return m_ID
End Get
Set(value As Integer)
m_ID = value
End Set
End Property
Private m_ID As Integer
Public Property Name() As String
Get
Return m_Name
End Get
Set(value As String)
m_Name = value
End Set
End Property
Private m_Name As String
End Class
End Namespace
控制器:
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.Mvc
Imports RadioButtonListForHelperTest.RadioButtonListForHelperTest.Models
Namespace Controllers
Public Class TestController
Inherits System.Web.Mvc.Controller
'
' GET: /Test
Function Index() As ActionResult
Dim list As New List(Of aTest)()
list.Add(New aTest() With { _
.ID = 1, _
.Name = "Line1" _
})
list.Add(New aTest() With { _
.ID = 2, _
.Name = "Line2" _
})
list.Add(New aTest() With { _
.ID = 3, _
.Name = "Line3" _
})
Dim sl As New SelectList(list, "ID", "Name")
Dim list2 As New List(Of aTest)()
list2.Add(New aTest() With { _
.ID = 1, _
.Name = "test1" _
})
list2.Add(New aTest() With { _
.ID = 2, _
.Name = "test2" _
})
Dim sl2 As New SelectList(list2, "ID", "Name")
Dim model = New TestModel()
model.TestRadioList = sl
model.TestRadioList2 = sl2
model.TestRadio = "2"
' Set a default value for the first radio button helper
Return View(model)
End Function
'
' POST: /Test
<HttpPost()> _
Public Function Index(model As TestModel, returnUrl As String) As ActionResult
If ModelState.IsValid Then
ModelState.AddModelError("", "Always force an error to be raised so we can test the postback sets the radio buttons to their last values.")
End If
' If we got this far, something failed, redisplay form
Dim list As New List(Of aTest)()
list.Add(New aTest() With { _
.ID = 1, _
.Name = "Line1" _
})
list.Add(New aTest() With { _
.ID = 2, _
.Name = "Line2" _
})
list.Add(New aTest() With { _
.ID = 3, _
.Name = "Line3" _
})
Dim sl As New SelectList(list, "ID", "Name")
Dim list2 As New List(Of aTest)()
list2.Add(New aTest() With { _
.ID = 1, _
.Name = "test1" _
})
list2.Add(New aTest() With { _
.ID = 2, _
.Name = "test2" _
})
Dim sl2 As New SelectList(list2, "ID", "Name")
model.TestRadioList = sl
model.TestRadioList2 = sl2
Return View(model)
End Function
End Class
End Namespace
查看:
@Imports RadioButtonListForHelperTest <!-- Andrew.San - Looked up Google on how to import a namespace in VB -->
@ModelType RadioButtonListForHelperTest.RadioButtonListForHelperTest.Models.TestModel
@Code
Dim obj1 As System.Web.Mvc.HtmlHelper(Of RadioButtonListForHelperTest.RadioButtonListForHelperTest.Models.TestModel)
Dim obj2 As System.Web.Mvc.HtmlHelper(Of RadioButtonListForHelperTest.RadioButtonListForHelperTest.Models.TestModel)
ViewData("Title") = "Index"
End Code
<h2>Index</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@Using Html.BeginForm()
@Html.ValidationSummary(True)
@<fieldset>
<legend>TestModel</legend>
<div class="editor-label">
@Html.LabelFor(Function(model) model.TestRadio)
</div>
<div class="editor-field">
@Html.RadioButtonForSelectList(Function(model) model.TestRadio, Model.TestRadioList)
<!-- Andrew.San
Apparently, the method isn't a member of
System.Web.Mvc.HtmlHelper(Of RadioButtonListForHelperTest.RadioButtonListForHelperTest.Models.TestModel),
which is odd; I don't see the need for a Model to have this method.
-->
@RadioButtonListForHelperTest.RadioButtonListForHelperTest.RadioButtonForSelectList(obj1, Function(model) model.TestRadio, Model.TestRadioList)
<!-- Andrew.San
The compiler needs me to send an htmlHelper argument to the
HtmlExtension RadioButtonForSelectList method,
which Jon Lanceley didn't need to do.
@Html.RadioButtonForSelectList(m => m.TestRadio, Model.TestRadioList)
-->
@Html.ValidationMessageFor(Function(model) model.TestRadio)
</div>
<div class="editor-label">
@Html.LabelFor(Function(model) model.TestRadio2)
</div>
<div class="editor-field">
<!-- Andrew.San
As per the first radio button list.
-->
@Html.RadioButtonForSelectList(Function(model) model.TestRadio2, Model.TestRadioList2)
@RadioButtonListForHelperTest.RadioButtonListForHelperTest.RadioButtonForSelectList(obj2, Function(model) model.TestRadio2, Model.TestRadioList2)
@Html.ValidationMessageFor(Function(model) model.TestRadio2)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
End Using
<div>
@Html.ActionLink("Back to List", "Index")
</div>
右。这就是我所拥有的一切。
答案 0 :(得分:0)
问题是您的扩展方法位于RadioButtonListForHelperTest
命名空间中,但在您的视图中,您尝试访问它时会查看System.Web.Mvc.Html
命名空间。 @Html
位于System.Web.Mvc
。
要在同一名称空间中访问您的扩展方法,您需要执行以下操作。
将当前名称空间更改为System.Web.Mvc.Html
。然后创建一个名为任意名称的静态类MyExtensions
,然后在此类中包含扩展方法。它必须是静态的。