2012-03-27 3 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

Если ваше мнение ожидает объект новостей, вы должны передать ему объект новостей. И если вы хотите работать с несколькими моделями вы можете создать вид модели:

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

Создать ViewModel - новая модель, содержащую как Новости и Категорию

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

и использовать эту модель в вашем представлении.

Смежные вопросы