0

我有一个需要在不使用 JavaScript 的情况下发布到服务器的表单。为此,我提交了表单并创建了一个模型来解析必要的参数。

我拥有的一件事是一张 RadioButtons 表。

也就是说,我有一个包含几行的表,并且在每一行中都有一些带有单选按钮的列。每行的单选按钮属于同一个列表,即每行可以选择一个选项,但可以多于一行(例如:您可以在第 1 行选择 Radiobutton 2,在第 2 行选择 RB 3,但不能在第 1 行选择 RB2和第 1 行中的 RB3 - 但是,您可以在未选中任何 RB 的情况下保留行-)。

有什么数据结构可以让我的模型解析这个单选按钮表吗?我发现我不能使用 RadioButtonFor 和属性的名称,因为这样所有的单选按钮都属于同一个列表(并且我只能整体选择一个选项)。我不知道如何让程序知道它们应该属于同一个属性,因为据我了解,MVC 通过该属性解析每个表单元素。

谢谢。

4

1 回答 1

1

我建议一个Dictionary<int, List<SelectListItem>>. 字典的 int 键是行号,List 是每个单选按钮组的选项。

我使用“RadioButtonListFor”助手将 SelectListItems 集合转换为单选按钮组(代码如下)。在您的视图中,您将对此代码进行修改,以放入各个单选按钮周围的表格单元格中。您可以为这个函数添加一个包装 HTML 块的参数:

// jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html
        public static MvcHtmlString RadioButtonListFor<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();
            sb.Append("<span class='RadioButtonListFor'> ");

            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 htmlAttributes = new Dictionary<string, object>();
                    htmlAttributes.Add("id", id);

                    if (item.Selected)
                        htmlAttributes.Add("checked", "checked");

                    var radio = htmlHelper.RadioButtonFor(expression, item.Value, htmlAttributes);


                    // Create the html string that will be returned to the client
                    // e.g. <label<input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" />Line1</label>
                    sb.AppendFormat("<label>{0} {1}</label> ", radio, HttpUtility.HtmlEncode(item.Text));
                }
            }

            sb.Append(" </span>");
            return MvcHtmlString.Create(sb.ToString());
        }
于 2013-02-19T16:39:47.170 回答