2015-05-17 2 views
-1

Я использую модели вложенных представлений для отображения представлений на основе ролей пользователей.Как отправить данные из вложенных ViewModel в контроллер

Модель:

public class MainVM { 
    //some properties 
    public OneVM One {get; set;} 
    public TwoVM Two {get; set;} 
} 

public class OneVM { 
    //properties 
} 

public class TwoVM { 
    //properties 
} 

Как написано here, что только основная модель должна быть отправлен контроллером. Я использую Automapper для сопоставления свойств полученной модели.

Контроллер:

public ActionResult EditAction(MainVM model){ 
    var item = db.Table.Find(model.Id); 
    //automapper to map 
    AutoMapper.Mapper.Map(model.One, item); //does not work 

    db.Entry(item).State = EntityState.Modified; 
    db.SaveChanges(); 
} 

Это правильный способ сделать это? Что я делаю неправильно здесь.

Update: Это мнение я использовал для отображения вложенных моделей просмотра с частичным видом

Вид:

@model MainVM 

@Html.RenderPartial("_OnePartial", Model.One) 

Этот ответ https://stackoverflow.com/a/6292180/342095 определяет помощник Html, который будет генерировать частичный вид с именами прав.

+0

'вар результат = Mapper.Map (пункт);' ' –

+0

@FarhadJabiyev Mapper.Map (пункт) ; 'но вы передали элемент в качестве источника? Хотя источником должен быть полученный параметр 'model' через – SMUsamaShah

+0

Вы не хотите конвертировать' item' в 'OneVM'? –

ответ

1

Проблема, вероятно, заключается в вашем HTML. Если модель вложенными, то поля ввода свойств должно быть так:

<input type="text" name="SubModel.PropertyName" /> 

Использование HTML-хелперы, это будет выглядеть примерно так:

@Html.EditorFor(model => model.SubModel.PropertyName) 

ASP.NET MVC Действие не может знать , что вы хотите заполнить свой подмодель, если это не в вашем HTML.

+0

Помощники в http://stackoverflow.com/questions/1488890/asp-net-mvc-partial-views-input-name-prefixes/6292180#6292180 не работают. – SMUsamaShah

+0

Если вы действительно хотите использовать частичные виды, вы можете рассмотреть возможность передачи родительской модели. Ответ, который я дал, будет работать в этом сценарии. Если вы не хотите передавать родительскую модель, вам, вероятно, придется использовать '@ Html.Editor (" SubModel.PropertyName ", Model.PropertyName)'. – annemartijn

1

Стоимость имущества One будет пустым, потому что вы передаете экземпляр OneVM к частичной (не основной модели), так что элементы управления формы не правильно названы с приставкой (которые должны быть name="One.SomeProperty").

Вы указали ссылку на помощник PartialFor() (который работает), но не используйте его. В главном виде она должна быть

@Html.PartialFor(m => m.One, "_OnePartial") 

Который является эквивалентом

@Html.Partial("_OnePartial", Model.One, 
    new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "One" }}) 
+0

Помощник получает вызов, но ничего не отображается. Помощник - это общее решение, почему я должен его избегать? Решение без помощника, как вы указали, действительно отображает частичное представление, и данные передаются в порядке. – SMUsamaShah

+0

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

+0

Извините, я не понимаю ваших комментариев. В вашем вопросе вы используете '@ Html.RenderPartial (« _ OnePartial », Model.One)', который является недопустимым и ничего не делает - он должен быть '@ {Html.RenderPartial (" _ OnePartial ", Model.One)}'. Но даже если вы использовали его правильно, это не добавляет префикс (по дизайну). Как я заметил в первой части моего ответа, вы включили ссылку на специальный вспомогательный метод с именем 'PartialFor()', который работает, если вы используете его правильно, что находится в вашем случае '@ Html.PartialFor (m => m .One, "_OnePartial") ' –

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