То, что я пытаюсь сделать, довольно просто, но я мог бы перепутать мои факты. У меня есть страница с подробной информацией, которая имеет собственный класс, так как это Model. Пользовательский класс использует 2 пользовательских объекта, а еще один пользовательский объект имеет свойство одного из 2. Страница сведений выводит достаточное количество информации, но позволяет пользователю оставлять комментарии. Когда пользователь нажимает кнопку «Опубликовать», на странице публикуется действие «Подробности», которое выглядит примерно так:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Details(VideoDetailModel vidAndComment) { ....}
Единственными полями в форме, которые публикуются, являются CommentText и VideoId. Вот как выглядит VideoDetailModel.
public class VideoDetailModel
{
public VideoDetailModel()
{
Video = new VideoDTO();
Comment = new CommentDTO();
}
public VideoDetailModel(VideoDTO vid)
{
Video = vid;
Comment = new CommentDTO();
}
public VideoDTO Video { get; set; }
public CommentDTO Comment { get; set; }
}
VideoDTO имеет несколько свойств, но мне нужны VideoId. К соответствующим свойствам CommentDTO относятся CommentText (который публикуется правильно) и объект UserDTO, который содержит свойство userId. Все, кроме значения CommentText, не публикуется. У меня также есть следующая строка на странице ascx, но значение модели никогда не публикуется в контроллере.
Html.Hidden("Model.Video.VideoId", Model.Video.VideoId);
Я действительно не уверен, что мне здесь не хватает. Я полагаю, что если бы я добавил больше полей формы для нужных мне свойств, они были бы опубликованы, но мне нужно только 1 поле ввода формы для CommentText. Если бы я мог получить то же значение объектов Model, которое было отправлено на страницу для публикации на странице, это помогло бы.
Я буду рад сделать любые разъяснения, необходимые здесь. Я просто в растерянности относительно того, что происходит.
UPDATE
Хорошо, похоже, решение довольно простое. Я думаю, что использование RenderPartial в середине формы проблематично из-за того, как форма записывается в html. Я не могу понять, почему все пошло не так, но если я сделаю свои RenderPartials перед своей формой, а затем начну свою форму с поля ввода текста и скрытого VideoId, ModelBinder по умолчанию будет работать нормально. Я начинал форму, писал скрытый VideoId, рендерил несколько частичных представлений, создавал поле CommentText, а затем закрывал форму. Поле CommentText будет очень хорошо связано. Скрытый VideoId не будет. Возможно, я где-то пропустил правило об использовании RenderPartial.
Для полноты, частичное представление, которое я рендерил, взял объект Comment и просто записал его данные CommentText. Некоторые из этих объектов будут существовать для одного объекта Video. Все эти данные были в пользовательском типе и переданы в представление (основной вид) как его модель. Это частичное представление не имело формы и не содержало полей для ввода данных.