这个问题一直困扰我两天了。有一些类似的帖子,但没有一个完全解决我的问题。
使用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的编辑被调用,如所期望的所有MyMainModle的数据在tact ….除了ThumbnailModel的列表 – 那些结果是null。
这应该怎么做?我尝试了许多不同的方法,包括使一个可编辑的模板和使用EditFor(o => …所有无法使用(这变得混乱,因为我不知道EditFor是否应该是整个集合或只是在集合中的一个项目 – 我尝试了两种方式)。所有使用的工作,直到我添加复选框的删除,因此需要检索ThumbnailModels列表检查内部Delete属性值。
谢谢大家的阅读和试图理解这一点。
解决方法
这里有一个例子,我用来说明一些概念:
模型:
- public class MyMainModel
- {
- public Guid? SelectedImage { get; set; }
- public string LongDescription { get; set; }
- public IEnumerable<ThumbnailModel> ThumbnailImagePathAndNames { get; set; }
- public HttpPostedFileBase File { get; set; }
- }
- public class ThumbnailModel
- {
- public Guid ImageGUID { get; set; }
- public bool Delete { get; set; }
- }
控制器:
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- var model = new MyMainModel
- {
- // TODO: fetch from the repository instead of hardcoding
- ThumbnailImagePathAndNames = new[]
- {
- new ThumbnailModel { ImageGUID = Guid.NewGuid() },new ThumbnailModel { ImageGUID = Guid.NewGuid() },}
- };
- return View(model);
- }
- [HttpPost]
- public ActionResult Index(MyMainModel model)
- {
- ... the model will be properly bound here
- }
- }
视图:
- @model AppName.Models.MyMainModel
- @{
- ViewBag.Title = "Index";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- @using (Html.BeginForm("index","home",new { enctype = "multipart/form-data" }))
- {
- <div class="editor-field">
- @Html.TextAreaFor(m => m.LongDescription)
- @Html.ValidationMessageFor(m => m.LongDescription)
- </div>
- <input type="file" name="file" />
- <!-- Use different names for the upload and complete submit
- buttons so that you can distinguish which one was clicked
- in the POST action
- -->
- <input name="upload" type="submit" value="Add Picture" />
- @Html.EditorFor(x => x.ThumbnailImagePathAndNames)
- <input name="complete" type="submit" value="Complete Edit!" />
- }
编辑器模板:(〜/ Views / Home / EditorTemplates / ThumbnailModel.cshtml):
- @model AppName.Models.ThumbnailModel
- <!-- Pass the image id as hidden field -->
- @Html.HiddenFor(x => x.ImageGUID)
- @Html.CheckBoxFor(x => x.Delete)