Эта проблема преследует меня уже два дня. Есть несколько похожих сообщений, но ни одна из них не полностью удовлетворяет мою проблему.
Использование MVC-3, синтаксис Razor:
- EDIT.cshtml -
@using (Html.BeginForm("Edit", "My", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<!-- Some fields... -->
<div class="editor-field">
@Html.TextAreaFor(m => m.LongDescription)
@Html.ValidationMessageFor(m => m.LongDescription)
</div>
<!-- Some more fields work... Including picture upload (summary).-->
<input name="button" type="submit" value="Add Picture" />
<!-- Picture Item display -->
@foreach(var thumbnail in Model.ThumbnailImagePathAndNames)
{
<img src="@Url.Content(@thumbnail.ThumbnailPicturePath)" alt="" width="200" />
@Html.RadioButtonFor(o=>o.SelectedImage, @thumbnail.ImageGUID) Primary Picture
<!-- Checkbox to mark for deletion -->
@Html.CheckBoxFor(o=>thumbnail.Delete) Delete ???????? <!---- Here is a problem - I don't understand how this should work -->
}
<input id="Submit1" name="button" type="submit" value="Complete Edit!" />
}
- MyController.cs -
[HttpPost]
public ActionResult Edit(String button, HttpPostedFileBase file, MyMainModel model)
{
// if button = submit picture, work with picture here and break(long story)
// save model data
// if valid, save and redirect
// not valid or error, load up view like normal but with error messages
model.LoadThumbnails();
return View(model);
}
- MyMainModel.cs -
public class MyMainModel
{
// some properties...
public Guid? SelectedImage { get; set; }
[Display(Name = "Detailed Description")]
public String LongDescription { get; set; }
// some more properties....
// and finally my list of models
public IList<ThumbnailModel> ThumbnailImagePathAndNames { get; set; }
public void LoadThumbnails()
{
// load up initial thumbnail models
this.ThumbnailImagePathAndNames = new List<ThumbnailModel>(readDataService.GetThumbnailModels(this.SomeID));
}
}
- ThumbnailModels.cs -
public class ThumbnailModel
{
public Guid ImageGUID { get; set; }
public String FullSizePicturePath { get; set; }
public String ThumbnailPicturePath { get; set; }
public bool Delete { get; set; }
}
Так в чем проблема? Ну, когда "Полное редактирование!" нажата кнопка, вызывается MyController Edit, как и ожидалось, со всеми данными MyMainModle в такте.... кроме списка ThumbnailModel - те, которые оказываются нулевыми.
Как это должно быть сделано? Я пробовал много разных подходов к этому, включая создание редактируемого шаблона и использование EditFor (o = > ... все безрезультатно (это запуталось, поскольку я не знал, должен ли EditFor быть для всей коллекции или просто один элемент в коллекции - я пробовал в обоих направлениях). Все использовались для работы до тех пор, пока я не добавил сложность флажка для удаления, поэтому вам нужно получить список ThumbnailModels, чтобы проверить, что значение свойства Internal Delete.
Спасибо, что прочитали и пытались понять это.
[Отказ от ответственности - некоторые имена переменных и методов были изменены для защиты невиновной программы. Много кода было удалено и заменено кодом комментария.]