MVC 3 Partial View и что мне нужно для него отправить? - PullRequest
2 голосов
/ 20 марта 2012

Меня интересует пара вариантов форм и частичных форм. Подтверждение находится на родительской странице, и я изменил то, что передаю в частичное представление. У меня есть родительское представление со связанной HomeViewModel (которая имеет открытые свойства Name и public Person Employee {get; set;}

1.) Сценарий 1: на главном экране есть что-то вроде следующего

@model MasterDetailSample.Models.HomeViewModel

@using (Html.BeginForm()) {
    <div>
        @{Html.RenderPartial("_PersonView", @Model);}
    </div>
    <input type="submit" value="Save" />        
}

В этом сценарии я перехожу к частичному представлению _PersonView всего HomeViewModel. В частичном представлении _PersonView я должен ссылаться на свойство объекта HomeViewModel, то есть Person, через @ model.Employee.Name (в этом сценарии отправка выполняется в родительской форме (не в частичном представлении))

Когда я нажимаю «Отправить» в форме (POST) в контроллере, я должен получить доступ к свойству «Имя» сотрудника с помощью следующей модели.

Кажется, что это работает, но обратите внимание на следующий вариант 2 (где я только частично передаю объект Employee)

2.) Сценарий 2 В этом сценарии я хочу отправить объект Employee только в частичное представление. Снова форма начала и отправки находится на родительской форме.

Итак, из родительской формы у меня есть

@{Html.RenderPartial("_MasterView", @Model.Employee);}

и т. Д. В частичном представлении я ссылаюсь на свойство Name объекта Person через @ Employee.Name. Теперь, когда я отправляю форму в контроллере, объект Employee недоступен из связывателя автоматической модели. Я могу получить доступ к свойствам через formcollection, но не из параметра модели

т.е.

    [HttpPost]
    public ActionResult Index(ModelViewModel model) {
        **//model.Employee is null!**
        return View();
    }

Почему ? (is model.Employee null) Я хотел бы, чтобы мое частичное представление принимало только объект типа Person, однако после отправки с родительской страницы свойство Employee имеет значение null. В частичном представлении я использую следующее в строке @model

@model MasterDetailSample.Models.Person

Мне бы хотелось, чтобы частичному объекту был нужен только объект Person для отправки на него, но я бы хотел отправить его в главной форме. Если я делаю это таким образом, я могу повторно использовать частичное представление в некоторых ситуациях, однако, если я должен отправить HomeViewModel, я значительно ограничил использование этого частичного представления. Итак, опять же, я хочу использовать Person только в качестве модели с частичным представлением, но мне нужно иметь возможность доступа к свойствам при отправке из родительского представления.

Можно ли это сделать? Если да, то как?

ТНХ

1 Ответ

1 голос
/ 20 марта 2012

У вас есть несколько вариантов:

1) Один, который я рекомендую -> Не использовать частичные представления, вместо этого используйте EditorFor и создайте шаблон редактора для Person.В случае частичных представлений контекст - это та модель, которую вы передаете в представление, поэтому ваш пример (1) работает, а (2) - нет.Однако в шаблонах редактора родительский контекст учитывается с помощью помощников html и генерирует правильные входные имена. Посмотрите на ответ Дарина Димитрова на похожий вопрос.

2) Используйте второй пример как есть, но измените действие публикации так, чтобы оно выглядело примерно так:

[HttpPost]
public ActionResult Index(ModelViewModel model) {
    TryUpdateModel(model.Employee);
    **//model.Employee should now be filled!**
    return View();
}

3) Используйте пользовательские помощники html, которые принимают префикс для ввода, см. этот ответ Я недавно отправил пример кода.Вы можете использовать это в своем частичном представлении.

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