0

У меня есть CreateViewModel.Привяжите галочки к списку с частичным видом

public class CreateViewModel 
{ 
    public AttributesViewModel AttributesInfo { get; set; } 
} 

The AttributesViewModel посылается частичный вид.

public class AttributesViewModel 
{ 
    public AttributesViewModel() 
    { 
    ChosenAttributes = new List<int>(); 
    } 

    public List<Attributes> Attributes { get; set; } 
    public List<int> ChosenAttributes { get; set; } 
} 

Список атрибутов выводится на частичном изображении. У каждого есть флажок.

foreach (var attribute in Model.Attributes) 
{ 
    <input type="checkbox" name="ChosenAttributes" value="@attribute.ID" /> @Attribute.Name 
} 

Когда я отправляю CreateViewModel, AttributesInfo.ChosenAttributes всегда пусто, даже если я проверил несколько коробок. Как правильно назначить каждый флажок, чтобы он привязывался к списку ChosenAttributes?

мое решение

Я принял предложение Стивена Муеке, чтобы сделать два способа связывания. Итак, я создал класс CheckboxInfo, который содержал Value, Text и IsChecked. Я создал для него EditorTemplate:

@model Project.CheckboxInfo 

@Html.HiddenFor(model => model.Text) 
@Html.HiddenFor(model => model.Value) 
@Html.CheckBoxFor(model => model.IsChecked)&nbsp;@Model.Text 

Один GIANT оговорку. Чтобы это нормально работало, мне пришлось создать EditorTemplate для класса AttributesViewModel. Без него, когда будет опубликован CreateViewModel, он не может привязать флажки к атрибутуИнформация.

ответ

1

Ваше имя: checkbox name="ChosenAttributes", но CreateViewModel не содержит имущества с именем ChosenAttributes (только один по имени AttributesInfo). Вы можете быть в состоянии сделать эту работу, используя

<input type="checkbox" name="AttributesInfo.ChosenAttributes" value="@attribute.ID" /> @Attribute.Name 

, но правильный подход заключается в использовании правильной модели представления, будет содержать логическое свойство (скажем) bool IsSelected и использовать строго типизированные хелперы связываться с вашими свойствами в for цикле или с помощью пользовательского EditorTemplate, чтобы ваши элементы управления были правильно названы, и вы получаете привязку к 2-сторонней модели.

+0

Атрибуты AttributesInfo.ChosenAttributes не работают. Я попробую двухсторонний способ привязки. – ScubaSteve

+0

Рад добавить код, если у вас возникли проблемы, но почему у вас есть 'CreateViewModel', который содержит только одно свойство (для' AttributesViewModel')? - или содержит другие свойства, которые вы просто не указали) –

+0

Да, он содержит другие свойства, которые я опустил. Это просто сделало бы более громоздким понять мою проблему с несущественными свойствами. – ScubaSteve

0

У меня был похожий сценарий, но я так и сделал. Решение не идеально, поэтому, пожалуйста, извините, если я что-то упустил, но вы должны иметь возможность связать. Я попытался также упростить ваше решение :)

Я изменил имя класса Attribute на CustomerAttribute, переименуйте его в любое удобное для вас время, используйте уникальное имя, а не множественное число. Добавьте свойство в свой класс CustomerAttribute, назовите его, как вам нравится, я позвонил моему IsChange.

public class CustomerAttribute 
{ 
    public bool IsChange { get; set; } 

    // The rest stays the same as what you have it in your Attributes class 

    public string Name { get; set; } // I'm assuming you have a name property 
} 

Удаления AttributesViewModel класса, вы на самом деле не нужны, я люблю простоту.

Измените CreateViewModel класс выглядеть следующим образом:

public class CreateViewModel 
{ 
    public CreateViewModel() 
    { 
      CustomerAttributes = new List<CustomerAttribute>(); 
    } 

    public List<CustomerAttribute> CustomerAttributes { get; set; } 
} 

Ваш контроллер будет выглядеть примерно так:

public ActionResult Create() 
{ 
    CreateViewModel model = new CreateViewModel(); 

    // Populate your customer attributes 

    return View(model); 
} 

Ваш метод действия пост контроллер будет выглядеть примерно так:

[HttpPost] 
public ActionResult Create(CreateViewModel model) 
{ 
    // Do whatever you need to do 
} 

На ваш взгляд, у вас будет что-то вроде этого:

<table> 
    <tbody> 

      @for (int i = 0; i < Model.CustomerAttributes.Count(); i++) 
      { 
       <tr> 
        <td>@Html.DisplayFor(x => x.CustomerAttributes[i].Name)</td> 
        <td>@Html.CheckBoxFor(x => x.CustomerAttributes[i].IsChange)</td> 
       </tr> 
      } 

    <tbody> 
</table> 

Создайте образец приложения и попробуйте код выше и посмотрите, работает ли он для вас.

Смежные вопросы