2012-04-30 6 views
0

SubCategory 개체를 만들려고합니다. 이렇게하려면 하위 범주 데이터가 포함 된 뷰 모델을 만들 것입니다 (하위 범주가 바인딩되는 범주 개체 포함).ViewModel이 양식을 제출할 때 null입니다.

내 양식을 게시하면 뷰 모델이 내 컨트롤러로 반환되지만 내 하위 범주의 모든 속성과 드롭 다운 목록에서 선택한 값이 null입니다.

무엇이 잘못 되었나요? : S

보기 :

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.master" Inherits="System.Web.Mvc.ViewPage<SkyLearn.Areas.Categories.Models.CategoryViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Create 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<h2>Create</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> 

<form action="" method="post" enctype="multipart/form-data"> 
    <%: Html.ValidationSummary(true) %> 
    <fieldset> 
     <legend>SubCategory</legend> 

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

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.subcategory.Icon)%> 
     </div> 
     <div class="editor-field"> 
      <input type="file" name="icon" id="icon"/> 
     </div> 

     <%: Html.DropDownListFor(selectedcategory => Model.selectedCategory, Model.categories) %> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.subcategory.Description)%> 
     </div> 
     <div class="editor-field"> 
      <%: Html.EditorFor(model => model.subcategory.Description)%> 
      <%: Html.ValidationMessageFor(model => model.subcategory.Description)%> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
</form> 

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

</asp:Content> 

<asp:Content ID="Content3" ContentPlaceHolderID="SideContent" runat="server"> 
</asp:Content> 

컨트롤러 :

[Authorize(Roles = "administrator")] 
     [HttpPost] 
     public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Icon) 
     { 
      SubCategory subcategory = viewmodel.subcategory; 

      subcategory.Category = categorycontroller.getCategoryByName(viewmodel.selectedCategory); 

      if (Icon != null && Icon.ContentLength > 0) 
      { 
       // extract only the filename 
       var fileName = Path.GetFileName(Icon.FileName); 
       // store the file inside ~/App_Data/uploads folder 
       var path = Path.Combine(Server.MapPath("../../Content/icons/"), fileName); 
       Icon.SaveAs(path); 
       subcategory.Icon = fileName; 
      } 

      if (ModelState.IsValid) 
      { 
       db.subcategories.Add(subcategory); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(subcategory); 
     } 

의 ViewModel : 뷰 모델은 하위 범주 메신저 바인딩 할 수 있습니다 만들려고 카테고리의 목록이 포함

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 
using System.Web.Mvc; 

namespace SkyLearn.Areas.Categories.Models 
{ 
    public class CategoryViewModel 
    { 
     public List<SelectListItem> categories; 
     public SubCategory subcategory; 
     public string selectedCategory; 

     public CategoryViewModel() 
     { 
      categories = new List<SelectListItem>(); 
      subcategory = new SubCategory(); 
      selectedCategory = ""; 
     } 
    } 
} 

에. 하위 카테고리를 만들 때 사용할 수있는 하위 카테고리 개체도 포함되어 있습니다. 마지막 속성은 드롭 다운 목록에서 선택 항목을 바인딩하는 데 사용하려는 문자열입니다.

+0

5 월 게시물 일 수 있습니다. http://stackoverflow.com/questions/9513385/creating-a-dropdown-in-mvc3-c-sharp-with-viewmodel-and-easy-model-binding-on-pos/ 9513747 # 9513747, 기본 모델 바인딩에 도움이됩니다. –

+0

나는이 주제에 대한 대부분의 게시물을 이미 읽었습니다. 내가 틀렸을 수도 있지만 이미 입력 필드 (html.editorfor) 및 올바른 이름을 바인딩하는 데 사용하는 것 같아요. 내가 완전히 틀릴 수도 있기 때문에 mvc에 다소 새로운 Im – AronChan

+0

다시 한번 나는 내가 Get를 추가하는 것만 큼 간단하게 잊어 버렸음을 부끄럽게 인정해야한다. 세트; 이제는 모두 작동합니다. 한숨.도움을 주셔서 감사합니다 – AronChan

답변

1

ASP.Net MVC3의 SelectListItem은 예상대로 동작하지 않습니다. 또한 드롭 다운 목록을 만들려면 Html.EditorFor() 대신 Html.DropDownListFor()를 시도하십시오. 뷰 모델에서

:

public IList<string> PossibleValues {get; set;} 
public string SelectedValue {get; set;} 

로드 당신의 ViewModel의 생성자에서 PossibleValues에 값. 보기에서

:

@Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.PossibleValues)) 

이것은 당신의 드롭 다운 목록을 자동 생성하고 모델에 바인딩됩니다. 원하는 경우 기본 값과 기타 사용자 정의를이 HTML 도우미 함수에 전달할 수 있습니다.

저장 기타 당신은 다른 값을 절약 할 수 있습니다 값, 사용자가 편집 할 수있는 옵션을 가지고 있지만 안 값으로, 미션 크리티컬 한 사용자가 편집 않는 경우없는

@Html.HiddenFor(m => m.RememberThisValue); 

이 값은 표시되지 않지만 DOM에서 여전히 편집 할 수 있으며 사용자가 원하는대로 게시 할 수 있습니다. POST 된 숨겨진 값을 확인하여 악의적 인 가치 주입으로부터 자신을 보호하십시오.

서버 측에서 중요한 모든 것을 저장하고 모델을 통해 해시/개인 키를 사용자에게 전달하고 정적 정보 사전을 구현하여 이러한 작은 정보를 저장합니다.

+0

나는 Html.DropDownListFor를 사용하고 있습니다. 드롭 다운 목록 도우미가 받아들이는 유일한 소스는 selectItem 목록입니다. 그래서 그렇게하면 오류가 발생할 것입니다. 나머지 속성을 모델에 바인딩하는 다른 방법이 있습니까? – AronChan

+0

답장을 보내 주시면 selectedvalue를 게시 할 수 있습니다. 보기의 올바른 값으로 채워지는 나머지 뷰 모델을 얻는 방법은 여전히 ​​내게 미스테리입니다. 그것에 대한 의견이 있으십니까? – AronChan

+0

네 말이 맞아. 내 예를 수정하고 나머지 가치에 대한 답변을 추가했습니다. – Khelvaster

관련 문제