2016-09-07 2 views
0

Это был колючий сон на моей стороне. Если я использую EditorFor для массива объектов, а редактор Template имеет форму в нем ex.Передача одного объекта при использовании редактора (модели [])

public class FooController:Controller{ 

    pubic ActionResult Action(Foo foo){ 
    blah... 
    } 
} 

Index.cshtml

@model IEnumerable<Foo> 
@Html.EditorFor(m=> m) 

EditorTemplate

@model Foo 
@using (Html.BeginForm("action", "controller")) 
{ 
    @Html.TextBoxFor(f=> f.A) 
    @Html.CheckBoxFor(f=> f.B) 
    @Html.LabelFor(f=> f.B) 
} 

Так что я ударил несколько проблем.

Флажок лейбла для не правильно связать с флажком (Это связано с этикеткой, не получив надлежащего имя свойства ([0].A в отличие от A).

Я знаю, что я могу избавиться от предварительного текста, сделав foreach на модели в Индексе, но который закручивает идентификаторы и имена в качестве рамки, не понимает, что есть кратные значения одного и того же элемента и дают им одинаковые имена.

Для флажков I как правило, делал это вручную как таковое.

@Html.CheckBoxFor(m => m.A, new {id= Html.NameFor(m => m.A)}) 
    <label for="@Html.NameFor(m => m.A)">A</label> 

Однако я не могу решить проблему неспособности контроллера принять элемент как единую модель. Я даже пытался разрешить массив Foo в параметрах Action, но это работает только тогда, когда его первый отредактированный элемент ([0]...), если его какой-либо другой элемент в массиве (например, [1].A), контроллер не знает, как разбирать Это. Любая помощь будет оценена по достоинству.

+0

Как о создании комплексной модели ? –

+0

@MarcLyon означает ли вы, что IEnumerable в родительском классе? Поскольку это побеждает всю цель обертывания каждого отдельного элемента в форме –

+0

, я не совсем уверен в вашем описании, но это может быть дубликат http://stackoverflow.com/q/25333332/11683 – GSerg

ответ

0

Сделайте свою модель классом со свойствами, которые вам нужны. создать класс в вашей Модели вложенной

public class MyModel { 
public IEnumerable<Foo> Foolist { get ; set;} 
public string Something { get;set;} 
} 

ваш EditorFor будет иметь цикл Еогеасп для Foolist ... MVC будет пытаться поставить модель вместе с формой и вернуть его в действие POST в контроллер.

Edit:

Вы можете создать EditorTemplate для обув. В Views/Shared папке/EditorTemplates, создать FooTemplate.cs

@model Foo 
<div class="span6 float-left" style="margin-bottom: 6px"> 
    @Html.TextBoxFor(m => m.A, new { style = "width:190px" }) 
    @Html.CheckBoxFor(m => m.B, new { style = "width:40px" }) 
    @Html.ValidationMessage("foo", null, new { @class = "help-inline" }) 
</div> 

затем на ваш взгляд

@foreach (var myFoo in Model) 
    { 
     @EditorFor(myFoo) 
    } 

Это до сих пор страдает от "модель получает передается обратно в целом" requiredment твоего. Не знаете, почему необходимо обрабатывать их индивидуально.

+0

Спасибо, но это именно то, что я пытаюсь избежать. Я не хочу, чтобы отправлять все данные каждой строки в IEnumerable. Я хочу отправить обратно определенный элемент. –

+0

Затем вам нужно будет использовать JavaScript и AJAX для отправки атомных запросов на контроллер для обновления или того, что вы делаете. Если вы используете IEnumerable в своей модели, MVC будет массировать значения и когда он вернет модель, это даст вам A. [0], которые вы пытаетесь избежать. В чем проблема с обработкой модели в целом? –

+0

Спасибо, что знаю параметры ajax и JS, но я пытаюсь o решить эту проблему без них. В данном случае, если действие было редактированием для модели, вы не хотите записывать, что каждый объект был отредактирован (если у вас есть auditDate для модели) только потому, что вы обновили 1 элемент из тысяч –

0

Hah наконец решил это - вот как я это сделал. Поскольку некоторые форматы HTML используют атрибут name при отправке форм, но метка для элемента использует Id. поэтому я только адаптирую тег id, чтобы иметь префикс, а не тег имени.

--В в cshtml файл

@{ 
    var prefix = ViewData.TemplateInfo.HtmlFieldPrefix; 
    ViewData.TemplateInfo.HtmlFieldPrefix = ""; 
} 

то я могу указать идентификатор для свойств их префиксом, позволяя имя остаются такими же, как и так

@Html.CheckBoxFor(m => m.A, 
        new {id = prefix+"."+ Html.NameFor(m => m.A)}) 
<label for="@[email protected](m => m.A)">A!</label></div> 
Смежные вопросы