Я довольно новичок в 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? Если я просто добавлю свойство под названием средства в модель представления, оно не будет привязано автоматически, и я пойму почему, поскольку я не связываю это с моим представлением. Но я не могу придумать, каким образом я мог бы это сделать.
Этот список флажков является пользовательским элементом управления, и я просто хотел избежать использования слишком большого массива string [] для моих методов действия.
[РЕДАКТИРОВАТЬ] - Хорошо, я смог сделать это, когда я попробовал сейчас. Не уверен, почему это не сработало раньше.
2) И, я проверял альтернативы и нашел этот ответ в SO:
CheckboxList в MVC3.0
И я смог повторить это, но мой вопрос, как мне привязать ярлык к этому флажку? Мои метки являются динамическими и являются частью модели и поэтому не могут быть жестко закодированы. Я пытался использовать Html.LabelFor, но это не сработало. В шаблоне редактора, если я просто @ Model.Text, он не будет работать и будет потерян после обратной передачи, так как он не привязан к свойству
Я гуглил и нашел предложения по созданию помощников HTML, что я и делал ранее (мой первый вопрос об этом).
Пожалуйста, дайте мне знать, если что-то неясно. Я мог бы уточнить. Любой вклад приветствуется!
Заранее спасибо!