2012-03-27 62 views
1

我創建一個新聞頁面。我有新聞模式和新聞有一個類別。類別來自數據庫。我希望能夠創建新聞併爲新聞分配類別。下面是我試圖做到這一點。問題是我試圖爲類別創建一個下拉列表,一旦表單被填充,它將被提交以保存在數據庫中。剃刀呈現新聞和類別,多個模型

這是錯誤:我通過IEnumerable<SelectListItem> categoriesList查看,但它期待新聞模式。我如何在一個視圖中使用多個模型?我如何修復下面的代碼,所以它會工作?

@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

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() }); 
    ViewBag.Categories = categoriesList; 

    // or fetch from DB or whatever 
    var news = new News(); 
    return View(news); 
} 

並在視圖:

@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; } 
} 

,並使用你的觀點,即模型的新模式。