【发布时间】:2011-07-14 14:39:36
【问题描述】:
我对 ASP.Net MVC(和剃须刀)还很陌生,我有几个问题。
1)
我创建了一个 HTML 扩展来创建一个复选框列表,如下所示:
public static HtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, List<InputItemInfo> ItemInfo)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentException("The argument must have a value", "name");
if (ItemInfo == null)
throw new ArgumentNullException("ItemInfo");
if (ItemInfo.Count < 1)
throw new ArgumentException("The list must contain at least one value", "ItemInfo");
StringBuilder sb = new StringBuilder();
ItemInfo.Insert(0, new InputItemInfo("*", "Select All", ItemInfo.All(i => i.IsChecked)));
foreach (InputItemInfo info in ItemInfo)
{
TagBuilder builder = new TagBuilder("input");
if (info.IsChecked) builder.MergeAttribute("checked", "checked");
builder.MergeAttribute("type", "checkbox");
builder.MergeAttribute("value", info.Value);
builder.MergeAttribute("name", name);
builder.InnerHtml = info.DisplayText;
sb.Append(builder.ToString(TagRenderMode.Normal));
sb.Append("<br />");
}
return new HtmlString(sb.ToString());
}
我能够在我的视图中使用它,并且还可以在控制器中获取值,如下所示:
@model List<AppTest.Models.InputExtensionsViewModel>
@{
ViewBag.Title = "Check";
}
<h2>Check</h2>
@using (Html.BeginForm())
{
<table border="0" style="border:0px;">
<tr>
<td valign="top">
@Html.Partial("CheckBoxList", Model[0])
</td>
</tr>
</table>
<br />
<input type="submit" value="Go" />
}
<div style="font-weight:bolder">
@ViewData["data"]
</div>
控制器:
public ActionResult Check()
{
var model = new List<InputExtensionsViewModel>();
var model1 = new InputExtensionsViewModel
{
Title = "Facilities",
InputElementName = "facilities",
InputElements = // a list
};
model.Add(model1);
return View(model);
}
[HttpPost]
public ActionResult Check(string[] facilities)
{
...
}
型号是:
public class InputExtensionsViewModel
{
public string Title { get; set; }
public string InputElementName { get; set; }
public List<InputItemInfo> InputElements { get; set; }
public void SetSelected(string[] items)
{
if (items == null)
return;
this.InputElements.ForEach(delegate(InputItemInfo info)
{
if (items.Contains(info.Value))
info.IsChecked = true;
});
}
}
我的问题是,有没有一种方法可以将数组项绑定到 InputExtensionsViewModel 模型中的属性?如果我只是向视图模型添加一个名为 facility 的属性,它不会自动绑定,我可以理解为什么,因为我没有在我的视图中绑定它。但我似乎想不出一种方法可以做到这一点。
这个复选框列表是一个用户控件,我只是想避免我的操作方法有太多的 string[] 数组。
[编辑] - 好的,我现在尝试时能够做到这一点。不知道为什么它以前不起作用。
2)而且,我正在检查替代方案,并在 SO:
我能够复制它,但我的问题是,如何将标签绑定到此复选框?我的标签是动态的,是模型的一部分,因此不能硬编码。我试图使用 Html.LabelFor 但这不起作用。在编辑器模板中,如果我只是@Model.Text,它将不起作用,并且在回发后会丢失,因为它没有绑定到属性
我在谷歌上搜索并找到了创建 HTML 助手的建议,这就是我之前所做的(我的第一个问题是关于这个的)。
如果有什么不清楚的地方请告诉我。我可以详细说明。任何意见表示赞赏!
提前致谢!
【问题讨论】:
标签: asp.net asp.net-mvc-3 razor