2012-03-27 4 views
1

뉴스 페이지를 만드는 중입니다. 뉴스 모델과 뉴스에 카테고리가 있습니다. 카테고리가 데이터베이스에서옵니다. 뉴스를 만들고 카테고리를 뉴스에 할당 할 수 있기를 원합니다. 아래는 제가 어떻게 해보려고했는지입니다. 문제는 카테고리에 대한 드롭 다운을 만들려고하고 양식이 채워지면 데이터베이스에 저장되도록 제출됩니다.뉴스와 카테고리를 렌더링하는 면도기, 복수 모델

여기에 오류가 있습니다. 저는 IEnumerable<SelectListItem> categoriesList을 전달하지만 News Model을 기대합니다. 하나의보기에서 여러 모델을 사용하려면 어떻게해야합니까? 어떻게하면 코드 아래에서 수정할 수 있습니까?

@model App.Models.News 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create news</h2> 

@using (Html.BeginForm()) { 
    <div> 
     <fieldset> 
      <legend>Category Information</legend> 

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

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Category) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.Category) 
       @Html.ValidationMessageFor(m => m.Category) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.NewsContent) 
      </div> 
      <div class="editor-field"> 
       @Html.TextAreaFor(m => m.NewsContent) 
       @Html.ValidationMessageFor(m => m.NewsContent) 
      </div> 
      <p> 
       <input type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
} 

     public ActionResult Create() 
     { 
      IList<Category> categories; 
      using (var session = NHibernateHelper.OpenSession()) 
      { 
       using (var tx = session.BeginTransaction()) 
       { 
        categories = session.CreateCriteria(typeof(Category)).List<Category>(); 
        tx.Commit(); 
       } 

      } 

      IEnumerable<SelectListItem> categoriesList = categories.Select(category => new SelectListItem() { Text = category.Name, Value = category.Id.ToString() }); 

      return View(categoriesList); 
     } 

답변

2

보기에 News 개체가 필요한 경우 News 개체를 전달해야합니다. 여러 모델로 작업하기를 원한다면 당신은 뷰 모델을 만들 수 있습니다

public class NewsViewModel 
{ 
    public string SelectedCategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 

    ... put any properties that your view might require 
} 

을하고 강하게 NewsViewModel에보기를 입력하고 컨트롤러 액션이보기에 그것의 인스턴스를 전달합니다.

public ActionResult Create() 
{ 
    IList<Category> categories; 
    using (var session = NHibernateHelper.OpenSession()) 
    using (var tx = session.BeginTransaction()) 
    { 
     categories = session.CreateCriteria(typeof(Category)).List<Category>(); 
     tx.Commit(); 
    } 
    IEnumerable<SelectListItem> categoriesList = categories.Select(category => new SelectListItem() { Text = category.Name, Value = category.Id.ToString() }); 
    var news = new NewsViewModel 
    { 
     Categories = categoriesList 
    }; 
    return View(news); 
} 

을하고보기 :

당신은 당신의 뷰에 뉴스 인스턴스를 통과해야

@model App.Models.NewsViewModel 

또 다른 가능성은 (내가 추천하지 않는) ViewBag를 사용하는 것입니다 :

와보기 :

@model App.Models.News 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create news</h2> 

@using (Html.BeginForm()) { 
    <div> 
     <fieldset> 
      <legend>Category Information</legend> 

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

      <div class="editor-label"> 
       @Html.LabelFor(m => m.Category) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.Category) 
       @Html.ValidationMessageFor(m => m.Category) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(m => m.NewsContent) 
      </div> 
      <div class="editor-field"> 
       @Html.TextAreaFor(m => m.NewsContent) 
       @Html.ValidationMessageFor(m => m.NewsContent) 
      </div> 

      <div class="editor-label"> 
       @Html.Label("SelectedCatgoryId") 
      </div> 
      <div class="editor-field"> 
       @Html.DropDownList("SelectedCatgoryId", (IEnumerable<SelectListItem>)ViewBag.Categories) 
       @Html.ValidationMessage("SelectedCatgoryId") 
      </div> 

      <p> 
       <input type="submit" value="Log On" /> 
      </p> 
     </fieldset> 
    </div> 
} 
1

당신은 당신의 두 가지 모델에 대한 래퍼 모델 클래스를 만들 수 있습니다

public class Wrapper 
{ 
    public App.Models.News News { get; set; } 
    public IEnumerable<SelectListItem> CategoriesSelectList { get; set; } 
} 

그런 다음 당신의보기에서 참조를 업데이트합니다.

1

는 뷰 모델 작성 - 뉴스 카테고리

public class MyViewModel { 
    public NewsType News { get; set; } 
    public IEnumerable<CategoriesType> Categories { get;set; } 
} 

하고보기에서 해당 모델을 사용하는 모두를 포함하는 새로운 모델을.