Не удалось связать html.checkbox в форме сообщения - PullRequest
1 голос
/ 20 мая 2011

Итак, у меня есть модель представления вызова ProductViewModel, в которой есть список сайтов, на которых можно производить продукт.Я пытаюсь выяснить, как показать это в форме, используя флажок для пользователя, чтобы выбрать сайты, где продукт может быть произведен.Кажется, прямо вперед, верно?Ну, это не работает, как я хочу / нуждаюсь.Надеясь, что кто-то может помочь мне найти правильный способ сделать это.

Мои занятия:

 public class ProductViewModel
 {
    public List<Sites> SiteList {get; set;}   
    public string ProductName {get; set;}
    public int ProductId {get; set;}
    public User ProductOwner{get; set;}
 }

 public class Sites
 { 
    public int SiteId {get; set;} 
    public string SiteName {get; set;}
    public bool IsSelected {get; set;}    
 }

Часть моего взгляда:

@Html.LabelFor(m=>m.Sites):
@foreach (var site in Model.Sites)
{
    @Html.CheckBox("Sites", site.IsSelected, new { value = site.SiteName })
    @Html.Label(site.SiteName)
} 

При использовании @Html.Checkbox () Я вижу следующий вывод в html из браузера:

<input checked="checked" id="Sites" name="Sites" type="checkbox" value="Miami" />
<input name="Sites" type="hidden" value="false" />

Я понимаю скрытое поле, но мне действительно нужно получить значение для выбранного элемента.Так что мне нужно вернуть список с Майами.Мне не нужна ложная / истинная вещь, которую, похоже, хочет послать html-помощник (т.е. Miami = true)

Так что вместо этого я попробовал это.

@for(int id=0; id < Model.Sites.Count(); id++)
{
    <input type="checkbox" id="@Model.Sites[id].SiteName" name="Sites[@id]" value="@Model.BoxingSites[id].SiteName" @(Model.Sites[id].IsSelected  ? @"checked=""checked""": "") />
    @Html.Label(Model.Sites[id].SiteName)                   
}  

И вывод:

<input type="checkbox" id="Miami" name="Sites[0]" value="Miami" checked=&quot;checked&quot; />
<label for="Miami">Miami</label>

В обоих этих случаях я не могу получить подшивку для сопоставления значений формы со списком Product.Sites при публикации в действии.

Действие похоже наэто:

[HttpPost]
public ActionResult Edit(ProductViewModel Product)
{
     //Does something with the form data.
}

Другие значения (ProductName и т. д.) отлично отображаются.

Что я делаю не так?Я чувствую, что чего-то не хватает, так как это должно быть проще из-за того, как MVC упрощает множество других ситуаций с обработкой форм.

Заранее спасибо ...

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Как насчет использования шаблона редактора вместо борьбы с циклами:

@model ProductViewModel
@using (Html.BeginForm())
{
    ... some other form fields

    @Html.LabelFor(x => x.SiteList)
    @Html.EditorFor(x => x.SiteList)

    <input type="submit" value="Create" />
}

и внутри соответствующего шаблона редактора ~/Views/Shared/EditorTemplates/Sites.cshtml:

@model Sites
<div>
    @Html.HiddenFor(x => x.SiteId)
    @Html.CheckBoxFor(x => x.IsSelected)
    @Html.LabelFor(x => x.SiteName)
</div>

Теперь не только код вашего представлениягораздо более понятный, но для полей ввода будут сгенерированы собственные имена, так что механизм связывания модели сможет связать выбранные значения обратно в действии POST.

[HttpPost]
public ActionResult Create(ProductViewModel model)
{
    ...
}
0 голосов
/ 08 ноября 2013

Вот что у меня работает.

// View Model
[Display(Name="Boolean Property")]
[UIHint("booleancheckbox"]
public bool? booleanProperty;

View

// View
@Html.EditorFor(m => m.booleanProperty, new { @onclick = "Toggle(this);" })

Шаблон редактора - добавьте еще код для обработки нулевых значений

// Editor Template booleancheckbox.cshtml
@model bool?

@{
    labelText = ViewData.ModelMetadata.DisplayName != null ?
                ViewData.ModelMetadata.DisplayName : 
                ViewData.ModelMetadata.PropertyName;
}

<label for="@ViewData.ModelMetadata.PropertyName">@labelText

    @Html.CheckBox(string.Empty, Model.Value, ViewContext.ViewData)

</label>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...