2015-08-12 1 views
1

Я добавил новый контроллер, то я выбрал следующие варианты:Как объединить два вида в одном представлении с помощью Asp.net MVC4?

  • Шаблон: MVC контроллер с чтения/записи действий и представлений, с помощью Entity Framework.
  • Модельный ряд: Фильм (MvcMovie.Models).
  • Класс контекста данных: MovieDBContext (MvcMovie.Models).
  • Просмотры: Razor (CSHTML).

У меня есть папка с представлениями, которая включает по умолчанию: Индекс, Творчество, Редактировать, Детали и Удалить.

Все работает отлично.

Моя проблема в том, что я пытаюсь объединить коды Create view с кодами Index View (Два вида в одном).

Ошибка, которую я получаю:

Компилятор Сообщение об ошибке: CS1061: «System.Collections.Generic.IEnumerable» не содержит определения для «Title» и не метод расширения «Title» Принятие первой аргумент типа 'System.Collections.Generic.IEnumerable' может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?)

Вот мой Merged View (Index.cshtml):

@model IEnumerable<ReMvc.Models.Movie> 

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Movie</legend> 

    <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.ReleaseDate) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ReleaseDate) 
     @Html.ValidationMessageFor(model => model.ReleaseDate) 
    </div> 

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

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

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

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Title) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ReleaseDate) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Genre) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Price) 
    </td> 
</tr> 
} 

</table> 

Вот мой контроллер: я переименовал «Создать» ActionResult Индекс

namespace ReMvc.Controllers 
{ 
public class MoviesController : Controller 
{ 
    private MovieDbContext db = new MovieDbContext(); 

    // 
    // GET: /Movies/ 

    public ActionResult Index() 
    { 
     return View(db.Movies.ToList()); 
    } 



    [HttpPost] 
    public ActionResult Index(Movie movie) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Movies.Add(movie); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(movie); 
    } 
} 

А вот моя модель: с использованием системы; с использованием System.Data.Entity;

namespace ReMvc.Models 
{ 
public class Movie 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public string Genre { get; set; } 
    public decimal Price { get; set; } 
} 

public class MovieDbContext : DbContext 
{ 
    public DbSet<Movie> Movies { get; set; } 
} 
} 

Я новичок в MVC и я застрял здесь в течение более 4 дней .. пожалуйста, помогите.

ответ

4

Чтобы начать свой model, это тип IEnumerable<ReMvc.Models.Movie>.

Так жалуется, что IEnumerable<T> не имеет метода или свойство Title:

@Html.LabelFor(model => model.Title) 

«System.Collections.Generic.IEnumerable» не содержит определение для «Title» и нет методы расширения 'Заголовок', принимающий первый аргумент типа 'System.Collections.Generic.IEnumerable»можно найти

Если вы не значит использовать IEnumerable<T> для модели так, чтобы изменить его:

@model ReMvc.Models.Movie 

Если ты хочешь использовать тип IEnumerable<T>, то вам нужно будет Переберите над вашими деталями для доступа к ним:

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
@foreach(var movie in Model) 
{ 
<fieldset> 
    <legend>Movie</legend> 

    <div class="editor-label"> 
     @Html.Label(movie.Title) 
    </div> 
    <div class="editor-field"> 
     @Html.Editor(movie.Title) 
     @Html.ValidationMessage(movie.Title) 
    </div> 
} 

Я также рекомендовал бы, что вы не имеете доступа к данным в вашем уровне представления (ваш контроллер). Посмотрите, как отделить доступ к данным от вашего пользовательского интерфейса.

Если вы хотите использовать тип IEnumerable<T> и тип ReMvc.Models.Movie в том же окне? Вам нужно будет сделать что-то похожее на следующее.

Вы можете создать новый тип и использовать это:

public class MovieViewModel() 
{ 
    public ReMvc.Models.Movie Movie { get; set; } 
    public IEnumerable<ReMvc.Models.Movie> MovieCollection { get; set; } 
} 

Затем вы можете передать, что в ваш взгляд

@model MovieViewModel 

В контроллере вы просто сделать это:

public ActionResult Index() 
{ 
    var model = new MovieViewModel() 
    { 
     MovieCollection = db.Movies.ToList(), 
    }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(Movie movie) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Movies.Add(movie); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    var model = new MovieViewModel() 
    { 
     Movie = movie, 
    }; 
    return View(movie); 
} 

Недостатком этого является то, что вам теперь нужно проверить, является ли он нулевым (потому что с вашим кодом один опорный erty всегда будет null или Movie или MovieCollection). Я бы рекомендовал разделить ваши взгляды и использовать другое имя метода действия, например. Детали.

+0

, Да, я хочу использовать тип IEnumerable и тип ReMvc.Models.Movie в том же представлении, поэтому я сделал это как упомянутый. Добавил новый тип, передал его и отредактировал мой контроллер .. и я получаю Сообщение об ошибке Parser: Неожиданное ключевое слово "foreach" после символа "@". После внутреннего кода вам не нужно префиксные конструкции, такие как «foreach» с «@». И когда я удаляю «@», я получаю сообщение об ошибке компилятора: CS1579: оператор foreach не может работать с переменными типа «ReMvc.ViewModel.MovieViewModel», потому что «ReMvc.ViewModel.MovieViewModel» не содержит общедоступного определения для «GetEnumerator», – Ayman

+0

Я хочу, чтобы вы увидели мой просмотр после редактирования, но я не смог опубликовать его в комментарии! – Ayman

+0

Workssss! теперь без ошибок, но foreach не возвращает никакого списка в представление Index, кажется, что MovieCollection пуст !!!! как сдать это, пожалуйста? здесь Index.cshtml файл [ссылка] (http://wikisend.com/download/554262/Index.cshtml) – Ayman

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