2012-02-28 1 views
1

У меня возникли проблемы с привязкой выбранного значения выпадающего списка к правильному свойству в моей модели просмотра. Я не вижу, что я делаю неправильно здесь. Я поставил код, который должен помочь показать, что я делаю ниже. Я пропустил некоторые вещи, такие как совокупность свойства AllFolders модели вида, поскольку это просто простой список с объектом, который называется ImageGalleryFolder.Не удается получить выбранное значение выпадающего значения для привязки для просмотра свойства модели

Каждый раз, когда форма отправляется назад, свойство ParentFolderId имеет значение null в обязательном порядке. Это сводит меня с ума, и я потратил много времени на то, чтобы разобраться.

Может ли кто-нибудь увидеть что-то, что я делаю неправильно?

Это вид модель

public class ImageGalleryFolderViewModel 
{ 
    [Required] 
    public string Title { get; set; } 

    public int Id { get; set; } 
    public string CoverImageFileName { get; set; } 
    public HttpPostedFileBase UploadedFile { get; set; } 
    public string ParentFolderId { get; set; } 
    public IList<ImageGalleryFolder> AllFolders { get; set; } 
} 

Вот код вида

@using Payntbrush.Presentation.Demo.MVC3.Areas.Admin 
@model Payntbrush.Presentation.Demo.MVC3.Areas.Admin.Models.ImageGalleryFolderViewModel 

@{ 
    ViewBag.Title = "Create A New Gallery Folder"; 
} 

<h2>@ViewBag.Title</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm((string)ViewBag.Action + "Folder", "Portfolio", FormMethod.Post, new { Id = "CreateFolder", enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 

     if(((string)ViewBag.Action).ToLower() == FormConstants.Edit.ToLower()) 
     { 
      @Html.HiddenFor(m => m.Id) 
      @Html.HiddenFor(m => m.CoverImageFileName) 
      @Html.HiddenFor(m => m.ParentFolderId) 
     } 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Title) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.UploadedFile) 
     </div> 
     <div class="editor-field"> 
      <input type="file" name="UploadedFile"/> 
      @Html.ValidationMessageFor(model => model.UploadedFile) 
     </div> 


    { 
     // Count > 1 is important here. If there is only 1 folder, then we still don't show the drop down 
     // as a child folder can't have itself as it's own parent. 
    } 
    if(@Model.AllFolders.Count > 1) 
     { 
      <div class="editor-label"> 
       Choose a parent folder (optional) 
      </div> 
      <div class="editor-field"> 
        @Html.DropDownListFor(m => m.ParentFolderId, new SelectList(Model.AllFolders, "Id", "Title")) 
      </div> 


     } 


    <p> 
      <input type="submit" value="Save" /> 
     </p> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Я мой взгляд пропущен, но это то, что моя форма выглядит при визуализации в браузере. Форма выглядит хорошо из того, что я вижу?

<form Id="CreateFolder" action="/SlapDaBass/Portfolio/EditFolder/1" enctype="multipart/form-data" method="post"> 
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="1" /> 
<input id="CoverImageFileName" name="CoverImageFileName" type="hidden" value="" /> 
<input id="ParentFolderId" name="ParentFolderId" type="hidden" value="" />   


<div class="editor-label"> 

      <label for="Title">Title</label> 

      </div> 

      <div class="editor-field"> 

       <input class="text-box single-line" data-val="true" data-val-required="The Title field is required." id="Title" name="Title" type="text" value="Test" /> 

       <span class="field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true"></span> 

      </div> 

      <div class="editor-label"> 

       <label for="UploadedFile">UploadedFile</label> 

      </div> 

      <div class="editor-field"> 

       <input type="file" name="UploadedFile"/> 

       <span class="field-validation-valid" data-valmsg-for="UploadedFile" data-valmsg-replace="true"></span> 

      </div> 

       <div class="editor-label"> 

        Choose a parent folder (optional) 

       </div> 

       <div class="editor-field"> 

         <select id="ParentFolderId" name="ParentFolderId"> 
          <option value="1">Test</option> 
          <option value="2">Test 2</option> 

         </select> 

       </div> 

     <p> 

       <input type="submit" value="Save" /> 

      </p> 

    </form> 

И это действие контроллера:

[HttpPost] 
     public ActionResult EditFolder(int id, ImageGalleryFolderViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       Services.PortfolioService.UpdateFolder(model.MapToDomainModel(), model.UploadedFile); 
       return Home; 
      } 
      return View(); 
     } 
+0

вы можете показать по крайней мере вы код в представлении для выпадающего списка –

+0

Просто добавили код! – Chris

ответ

1

изменить тип данных о ParentFolderId

public class ImageGalleryFolderViewModel 
{ 
    [Required] 
    public string Title { get; set; } 

    public int Id { get; set; } 
    public string CoverImageFileName { get; set; } 
    public HttpPostedFileBase UploadedFile { get; set; } 
    public int ParentFolderId { get; set; } 
    public IList<ImageGalleryFolder> AllFolders { get; set; } 
} 

также использовать помощник Html для DropDownList

<%: 
    Html.DropDownListFor(
      model => model.ParentFolderId , 
      new SelectList(
        new List<Object>{ 
         new { value = 1 , text = "Test" }, 
         new { value = 2 , text = "Test2" }, 
         new { value = 3 , text = "Test3"} 
        }, 
        "value", 
        "text" 
      ) 
     ) 
%> 

я надеюсь вы Напечатайте ваше мнение наподобие

public ActionResult EditFolder() 
    { 

     return View(new ImageGalleryFolderViewModel()); 
    } 
0

См. ниже ссылку для выпадающего списка привязки. Это будет очень полезно для вас.

ASP.NET MVC - drop down list selection - partial views and model binding

Вот если вы не хотите, чтобы создать свойство в модели для списка элементов, чем вы можете хранить его в ViewData или ViewBag. Пожалуйста, найдите пример кода ниже.

<%= Html.DropDownList("Category.CategoryId", new SelectList((
IEnumerable<ProductManagement.Models.Category>)ViewData["CategoryList"], 
"CategoryId", "CategoryName"))%> 
0

Вы создаете скрытый ввод для ParentFolderId с пустым значением. Это, вероятно, переопределяет значение, которое пытается удалить DropDownList. Удалить эту строку:

@Html.HiddenFor(m => m.ParentFolderId) 
0

у вас есть 2 элемента для ParentFolderId

один из них скрытое поле

@Html.HiddenFor(m => m.ParentFolderId) 

второй это выбрать элемент

@Html.DropDownListFor(m => m.ParentFolderId, new SelectList(Model.AllFolders, "Id", "Title")) 

и ModelBinder привязать первый согласованное значение элемента для модели.

Вы должны удалить скрытое поле