2012-07-12 23 views
0

我的模型如何在asp.net mvc的onclick事件注册@ Html.RadioButtonForSelectList 3.0

public class IndexViewModel 
{ 
    public IEnumerable<SelectListItem> TestRadioList { get; set; } 

    [Required(ErrorMessage = "You must select an option for TestRadio")] 
    public String TestRadio { get; set; } 

    [Required(ErrorMessage = "You must select an option for TestRadio2")] 
    public String TestRadio2 { get; set; } 
} 

public class aTest 
{ 
    public Int32 ID { get; set; } 
    public String Name { get; set; } 
} 

我的控制器

public ActionResult Index() 
    { 
     List<aTest> list = new List<aTest>(); 
     list.Add(new aTest() { ID = 1, Name = "Yes" }); 
     list.Add(new aTest() { ID = 2, Name = "No" }); 
     list.Add(new aTest() { ID = 3, Name = "Not applicable" }); 
     list.Add(new aTest() { ID = 3, Name = "Muttu" }); 
     SelectList sl = new SelectList(list, "ID", "Name"); 
     var model = new IndexViewModel(); 
     model.TestRadioList = sl; 
     return View(model); 
    } 

我查看

@using (Html.BeginForm()) { 
<div> 
    @Html.RadioButtonForSelectList(m => m.TestRadio, Model.TestRadioList) 
</div> 

}

帮手法

public static class HtmlExtensions 
{ 
    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, 
     IEnumerable<SelectListItem> listOfValues) 
    { 
     var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     var sb = new StringBuilder(); 

     if (listOfValues != null) 
     { 
      // Create a radio button for each item in the list 
      foreach (SelectListItem item in listOfValues) 
      { 
       // Generate an id to be given to the radio button field 
       var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value); 

       // Create and populate a radio button using the existing html helpers 
       var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text)); 
       var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { 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> 
       sb.AppendFormat("<div class=\"RadioButton\">{0}{1}</div>", radio, label); 
      } 
     } 

     return MvcHtmlString.Create(sb.ToString()); 
    } 
} 

这是我使用的代码...不知道如何给控件一个onclick事件。在助手方法中,我找不到任何合适的htmlattributes参数。根据我的要求。点击列表中的任何一个单选按钮,我需要调用一个参数很少的js函数。我无法做到这一点。 Someonce请帮忙。提前致谢。

+0

你的帮手是否来自这里? http://jonlanceley.blogspot.ch/2011/06/mvc3-radiobuttonlist-helper.html – 2012-07-12 10:22:14

+0

谢谢你的回复拉斐尔。我没有使用jonlanceley.blogspot.ch/2011/06/的助手。我已经用助手Method编辑过我的帖子。请看看,让我知道。谢谢 – suman 2012-07-12 10:47:48

回答

0

我还没有办法测试此刻,但一个大概的想法是将IDictionary htmlAttributes添加到该方法并将其传递到那里。如果你没有在视图中选择所需的onClick代码,那么你可以省略该参数并做到这一点的扩展方法

public static class HtmlExtensions 
    { 
     public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
      this HtmlHelper<TModel> htmlHelper, 
      Expression<Func<TModel, TProperty>> expression, 
      IEnumerable<SelectListItem> listOfValues, 
      IDictionary<string, Object> htmlAttributes) 
     { 
      var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
      var sb = new StringBuilder(); 

      if (listOfValues != null) 
      { 
       // Create a radio button for each item in the list 
       foreach (SelectListItem item in listOfValues) 
       { 
        // Generate an id to be given to the radio button field 
        var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value); 

        // Create and populate a radio button using the existing html helpers 
        var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text)); 

        htmlAttributes["id"] = id; 
        var radio = htmlHelper.RadioButtonFor(expression, item.Value, htmlAttributes).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> 
        sb.AppendFormat("<div class=\"RadioButton\">{0}{1}</div>", radio, label); 
       } 
      } 

      return MvcHtmlString.Create(sb.ToString()); 
     } 
    } 

然后调用它使用类似:

@Html.RadioButtonForSelectList(m => m.TestRadio, Model.TestRadioList, new { onclick="someFunction();" }) 

另外,您可以设置一个css类并绑定到click事件。例如,

<script type="text/javascript> 
    $('.someClassName').click(function() { 
    alert('clicked'); 
}); 
</script> 

@Html.RadioButtonForSelectList(m => m.TestRadio, Model.TestRadioList, new { @class="someClassName" }) 
+0

嗨菲尔,喜欢你的问题和赏金,所以我扼杀了你一点点,并为你提供了很好的答案,并帮助了其他人。 – 2013-06-29 06:40:24

+0

非常友善的克里斯 - 我需要点! – Phil 2013-07-03 19:35:11