ASP.NET MVC 3: редактировать «коллекцию» предметов - PullRequest
1 голос
/ 02 февраля 2012

Я сейчас редактирую пользовательский объект со словарем Dictionary<MyOtherObject,Boolean>.

public class MyObject{
   public int SomeProperties{get;set;}
   public int SomeMoreProperties{get;set;}
   ....
   public Dictionary<MyOtherObject, Boolean> Attributions{get;set;}
}

Цель состоит в том, чтобы я мог иметь список флажков для каждого элемента в словаре и решить, проверять его или нет.

Я пытался создать и отредактировать шаблон для моего свойства "Attribution". Он отображает отлично, принимая во внимание, какие значения были выбраны. Но когда я отправляю, я получаю ноль для словаря.

Так, что хороший способ сделать это?

Я нашел этот пост переполнения стека , в котором почти та же проблема, вместо этого у меня есть словарь, а не простые свойства. Насколько хорошо MVC справляется с ними?

Я могу преобразовать свои данные, но я не вижу способа не иметь «Список» элемента. Также найдено это но ответов нет

EDIT Мой коллега сделал несколько попыток, начав отображать только список bool вместо списка объектов: С объектом

public class TheViewObject{
   //other fields
   List<bool> MyList{get;set;}
}

В представлении, если мы сгенерируем форму с @Html.EditorFor(m=>m.MyList), мы получим это:

<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_0_" name="MyList[0]" value="true" type="checkbox">
<input class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_1_" name="MyList[1]" value="true" type="checkbox">
<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_2_" name="MyList[2]" value="true" type="checkbox">
<input name="MyList[0]" value="false" type="hidden"><input name="MyList[1]" value="false" type="hidden"><input name="MyList[2]" value="false" type="hidden">

Это работает, потому что он знает, как обращаться с List<bool>. Этот код работает, и мы получаем правильные данные в форме возврата.

Теперь, если у нас есть шаблон

@model List<bool> 

@for (int i = 0; i < Model.Count; i++) { 
  @Html.EditorFor(x => Model[i]) 
} 

И результат:

<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__0_" name="MyList.[0]" value="true" type="checkbox">
<input name="MyList.[0]" value="false" type="hidden">
<input class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__1_" name="MyList.[1]" value="true" type="checkbox">
<input name="MyList.[1]" value="false" type="hidden">
<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__2_" name="MyList.[2]" value="true" type="checkbox">
<input name="MyList.[2]" value="false" type="hidden"> </td> 

Результат в основном тот же, ЗА ИСКЛЮЧЕНИЕМ, что у нас есть дополнительное "." между MyList и [x]. С этим синтаксом связыватель модели не может понять, как связать объект.

Я думаю, что это в основном то, что происходит с нашим Словарём раньше (мы протестировали со списком, та же проблема)

(сейчас я тестирую beginollectionitem Стива Сандерсона )

Ответы [ 4 ]

2 голосов
/ 02 февраля 2012

Эта ссылка должна помочь вам .Старый, но вкусный.

У меня не было бы словаря в модели представления.Вы правы, хотя, это должен быть какой-то список.Вы можете использовать массив, список, коллекцию, ienumerable, как угодно.

public MyOtherMetaObject[] Attributions { get; set; }

MyOtherMetaObject также должен содержать нужное вам значение bool.Это как словарь "грубой силы".

Затем вы можете следовать руководству в блоге Haack, чтобы убедиться, что входные элементы названы правильно.Для этого мы используем HtmlHelper от Стива Сандерсона, @ Html.BeginCollectionItem .

1 голос
/ 02 февраля 2012

Иногда MVC не может автоматически угадать, как сопоставить данные формы с правильной моделью. Если это так, вы должны убедиться, что это не ваша вина :) Вы должны дважды проверить, нет ли способа сделать это автоматически. Если проблема действительно сложна для картографа, вы можете сгенерировать ModelBinder.

В вашем контроллере у вас есть это:

[HttpPost]
public ActionResult Method([ModelBinder(typeof(YourModelBinder))]YourModel model)
{
}

Затем вы создаете класс YourModelBinder:

public class YourModelBinder : DefaultModelBinder
{
  public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    YourModel result = base.BindModel(controllerContext, bindingContext) as YourModel;

    // here you read all the form keys/values and stuff and build up your model

    return result;
  }
}

Однако я не уверен, как сопоставить это с вашим MyObject материалом, поскольку я понятия не имею, какая у вас модель и т. Д.

0 голосов
/ 22 апреля 2015

Недавно я написал статью о том, как реализовать форму редактирования для сущности с сортируемой дочерней коллекцией. Код в статье использует асинхронные запросы для добавления дополнительных элементов в коллекцию и пользовательский интерфейс JQuery для сортировки элементов:

http://blog.rsuter.com/asp-net-mvc-how-to-implement-an-edit-form-for-an-entity-with-a-sortable-child-collection/

0 голосов
/ 18 октября 2012

Привет, я знаю, что вопрос немного стар, но это может кому-то помочь.Если вам нужен учебник по MVC3 для рендеринга и публикации коллекции значений флажков как части объекта модели представления и сохранения их в БД, взгляните на мой ответ на этот вопрос:

Сохранение многих для многих данных отношений в MVC Создание представления

В нем подробно описывается, как сначала настроить контекст данных, используя код Entity Framework, а также модели, модели представления, код Razor и действия контроллера в первую очередь.рендер, а затем сохранить опубликованные данные обратно в БД.

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