asp.net mvc привязка между моделью и представлением - PullRequest
1 голос
/ 03 января 2012

Я новичок в asp.net mvc. Вот так выглядит моя модель:

 [Bind(Exclude = "JournalId")]
public class Journal
{
    [ScaffoldColumn(false)]
    public int JournalId { get; set; }

    [DisplayName("Customer")]
    public int CustomerId { get; set; }

    [DisplayName("Till")]
    public int TillId { get; set; }

    [Required(ErrorMessage = "A Journal name is required")]
    [StringLength(160)]
    public string Name { get; set; }

    [DisplayName("Journal creation date")]
    public DateTime Date { get; set; }

    [DisplayName("Journal creation time")]
    public DateTime Time { get; set; }

    public virtual Customer Customer { get; set; }
    public virtual Till Till { get; set; }

}

[Bind(Exclude = "CustomerId")]
public class Customer
{
    [ScaffoldColumn(false)]
    public int CustomerId { get; set; }

    [Required(ErrorMessage = "A customer name is required")]
    [StringLength(160)]
    public string Name { get; set; }

    [StringLength(250)]
    public string Address { get; set; }
}


[Bind(Exclude = "TillId")]
public class Till
{
    [ScaffoldColumn(false)]
    public int TillId { get; set; }

    [Required(ErrorMessage = "A till no is required")]
    [StringLength(160)]
    public string TillNo { get; set; }

    [StringLength(100)]
    public string TillOperator { get; set; }
}

Вот как определяется действие моего контроллера:

 public ViewResult Index()
    {
        var journals = db.Journals.AsEnumerable<Journal>();
        ViewData["journals"] = journals;
        return View();
    }

и вид:

@model IEnumerable<ErikDemo.Models.Journal>
@foreach (var item in (IEnumerable<ErikDemo.Models.Journal>)ViewData["journals"]) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Customer.Name)
    </td>
    <td>
        @Truncate(item.Till.TillNo, 25)
    </td>
    <td>
        @Truncate(item.Name, 25)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Date)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Time)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.JournalId }) |
        @Html.ActionLink("Details", "Details", new { id=item.JournalId }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.JournalId })
    </td>
</tr>

Хотя во время отладки я вижу в контроллере, что список, переданный в представление, не пустой, а также я вижу, что ViewData ["journals"]. Local в часах не пуст, ничего не отображается. Я также использовал View.Model и return View (journals.ToList ()) для отправки данных в View, но, похоже, ничего не работает. В чем здесь проблема? Были на этом полдня.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Это неправильно: (Ну, это можно сделать так, но я думаю, что вы хотите передать модель)

public ViewResult Index()
{
    var journals = db.Journals.AsEnumerable<Journal>();
    ViewData["journals"] = journals;
    return View();
}

Попробуйте это:

public ViewResult Index()
{
    var journals = db.Journals.AsEnumerable<Journal>();

    return View(journals); //You just passed journals as a model
}

Также, если вы используете mvc 3, вы можете использовать ViewBag вместо ViewData

Пример:

ViewData["Journal"] = "my string";

совпадает с

ViewBag.Journal = "my string";

ViewBag является динамическим, поэтому вы можете использовать точечную запись.

Дополнительно

Этот код:

@model IEnumerable<ErikDemo.Models.Journal>
@foreach (var item in (IEnumerable<ErikDemo.Models.Journal>)ViewData["journals"])

Должно быть так:

@model IEnumerable<ErikDemo.Models.Journal>
@foreach (var item in Model)

Обновление:

Я не уверен, что вы делаете с этим db.Journals.AsEnumerable<Journal>();

У вас должен быть метод, который получает данные из таблицы или таблиц и возвращает Journals. Допустим, все это происходит из одной таблицы в базе данных:

public class JournalViewModel
{
    public IEnumerable<Journals> GetJournals()
     {
         using(var db = new ErikDataContext())
          {
              return db.Journals.ToList();

          }
     }
}

Тогда в действии:

public ViewResult Index()
{
    var journals = new JournalsViewModel.GetJournals();

    return View(journals); //You just passed journals as a model
}
1 голос
/ 03 января 2012

Вы забыли тег <table>?Если вы не просматривали источник своей страницы в том виде, в каком она отображается, я бы порекомендовал вам сделать это в качестве следующего шага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...