如何在单个视图上创建和显示模型数据?

时间:2014-10-20 22:16:55

标签: c# asp.net asp.net-mvc

目标是能够在同一视图中的模型中创建和显示无序列表项。

这是我到目前为止所做的事 的模型: Notes.cs

namespace NoteTaking.Models
{
    public class Notes
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public float Time { get; set; }
    }

    public class MyDbContext : DbContext
    {
        public MyDbContext() : base("Notes")
        {

        }

        public DbSet<Notes> Notes { get; set; }
    }
}

HomeController.cs

namespace NoteTaking.Controllers
{
    public class HomeController : Controller
    {
        MyDbContext db = new MyDbContext();
        // GET: Home
        public ActionResult Index()
        {
            return View(db.Notes.ToList());
        }

        // POST: Home
        [HttpPost]
        public ActionResult Index([Bind(Include = "Id,Text,Time")]Notes notes)
        {
            if (ModelState.IsValid)
            {
                db.Notes.Add(notes);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View();
        }
    }
}

Index.cshtml

@model NoteTaking.Models.Notes

@{
    ViewBag.Title = "Index";
}

<div class="jumbotron"></div>

@using (Html.BeginForm())
{
    @Html.EditorFor(model => model.Text)
    <input type="submit" value="Create" class="btn btn-default" />
}

<div>
    <h2>Notes</h2>
    @foreach (var d in Model.Text)
    {
        <ul>
            <li>
                @d
            </li>
        </ul>
    }
</div>

我知道我会得到一个编译错误,我试图通过做很多事情来解决这个问题,例如使用IEnumerable,但这并不允许我使用@ Html.EditorFor。

我很困惑。

3 个答案:

答案 0 :(得分:0)

这是因为你在

中迭代IEnumerable类型
   @for (var d in Model.Text)
    {
        <ul>
            <li>
                @d
            </li>
        </ul>
    }

并且您的模型仅声明

@model NoteTaking.Models.Notes

尝试将其设为Enumerable类型:

@model IEnumerable<NoteTaking.Models.Notes>

/*
    Your codes here
*/

编辑:

现在我明白你的意思了。您可能希望在同一页面上显示新添加/编辑的实体。现在,你可以这样做:

@model NoteTaking.Models.Notes

    @{
        ViewBag.Title = "Index";
    }

    <div class="jumbotron"></div>

    @using (Html.BeginForm())
    {
        @Html.EditorFor(model => model.Text)
        <input type="submit" value="Create" class="btn btn-default" />
    }

    <div>
        <h2>Notes</h2>
        @foreach (var d in Model.ToList())
        {
            <ul>
                <li>
                    @d.Text
                </li>
            </ul>
        }
    </div>

答案 1 :(得分:0)

您的索引方法正在返回一组笔记

return View(db.Notes.ToList());

所以视图应该是

@model IEnumerable<NoteTaking.Models.Notes>
@using (Html.BeginForm())
{
  @Html.EditorFor(m => m)
  <input type="submit" value="Create" class="btn btn-default" />
}

将显示所有Notes。默认情况下,这将为笔记的所有3个属性创建输入。您可以在EditorTemplate中创建名为Notes.cshtml的自定义Views/Shared/EditorTemplates来自定义您的显示

@model NoteTaking.Models.Notes
@Html.HiddenFor(m => m.ID)
@Html.TextBoxFor(m => m.Text)
@Html.HiddenFor(m => m.Time)

,你的POST方法应该是

public ActionResult Index(IEnumerable<Notes> notes)

因为你正在编辑一组笔记。

注意:由于所有注释都已使用EditorFor

显示,因此在无序列表中显示集合的次数也不多。

修改

根据您修改后的要求,您需要一个包含要显示和编辑的属性的视图模型

public class NotesVM
{
  public List<Notes> NoteList { get; set; }
  public Notes NewNote { get; set; }
}

并在控制器中

public ActionResult Index()
{
  NotesVM model = new NotesVM();
  model.NewNote = new Notes();
  model.NoteList = db.Notes.ToList();
  return View(model);
}

并在视图中

@model NotesVM
....
@using (Html.BeginForm())
{
  @Html.EditorFor(m => m.NewNote.Text)
  <input type="submit" value="Create" class="btn btn-default" />
}
....
<ul>
  @foreach (var d in Model.NotesList)
  {
    <li>@d.Text</li>
  }
</ul>

和帖子方法

[HttpPost]
public ActionResult Index([Bind(Prefix="NewNote")]Notes model)
{
  // Note you only have a control for `Test` so `ID` and `Time` will both be default values
  if (ModelState.IsValid)
  {
    db.Notes.Add(model);
    db.SaveChanges();
    return RedirectToAction("Index");
  }
  return View(model);
}

注意我还建议为类Notes创建一个视图模型,以便添加验证属性

答案 2 :(得分:0)

使用部分视图,你可以让模型成为模型的集合,这是一个非常粗略的例子,但我模拟了一些使用EF6和快速代码优先数据库的东西......

这不是世界上最快的东西,但演示了如何从EntityFramework返回结果集合,该结果绑定到View作为模型。以及如何添加新项目。可以对此进行许多调整。

一个这样的调整:返回带有AsNoTracking的模型,这样就不会被跟踪(无论如何都无法跟踪回发)。

  1. 浏览

    /Views/Home/Index.cshtml /Views/Shared/NewNote.cshtml /Views/Shared/Notes.cshtml

  2. 控制器

    public class HomeController : Controller
    {
        MyDbContext data = new MyDbContext();
    
        public ActionResult Index()
        {
            var notes = data.Notes;
            return View(notes);
        }
    
        public ActionResult AddNewNote(Models.Note model)
        {
            data.Notes.Add(model);
            data.SaveChanges();
            var notes = data.Notes;
            return Redirect("~/");
        }
    }
    
  3. 模型

    public class Note
    {
        public int Id { get; set; }
    
        public string Text { get; set; }
    
        public long Time { get; set; }
    }
    
  4. 型号EF Config Class

    public class NoteConfig : EntityTypeConfiguration<Note>
    {
        public NoteConfig()
        {
            this.HasKey(p => p.Id).Property(p1 => p1.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        //this.HasRequired(p => p.Text);
         }
    }
    
  5. 的DbContext

    public class MyDbContext : DbContext
    {
        #region DBSet
        public DbSet<Models.Note> Notes { get; set; }
        #endregion
    
        #region Constructor
        public MyDbContext()
            : base("Data Source=" + HttpContext.Current.Server.MapPath("~/Bin/NotesExample.sdf"))
        {
            this.Configuration.AutoDetectChangesEnabled = true;
            this.Configuration.LazyLoadingEnabled = true;
            this.Configuration.ValidateOnSaveEnabled = true;
            this.Database.CreateIfNotExists();
        }
        #endregion
    
        #region Methods
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            NoteConfig noteConfig = new NoteConfig();
            modelBuilder.Configurations.Add(noteConfig);
            base.OnModelCreating(modelBuilder);
        }
        #endregion
    }
    
  6. Index.cshtml

    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title></title>
    </head>
    <body>
        <div>
            @{ Html.RenderPartial("Notes"); }
        </div>
    </body>
    </html>
    
    1. Notes.cshtml

      @model System.Data.Entity.DbSet<NotesExample.Models.Note>
      @{
          MyDbContext context = new MyDbContext();
          int noteCount = Model.Count();
          var notes = Model.ToList();
      }
      @for (int i = 0; i < noteCount || (notes.Count == 0 && i == 0); ++i)
      {
          if (notes.Count == 0 || i == notes.Count - 1)
          {
              //Add New Note
              Html.RenderPartial("NewNote", new NotesExample.Models.Note());
          }
          else
          {
              //Render Exising Notes
              var note = notes[i];
              <div>
                  <h3>Note ID: @note.Id</h3>
                  <h3>Text: @note.Text</h3>
                  <h3>Time (ticks): @note.Time</h3>
              </div>
          }
      }
      
    2. NewNote.cshtml

      @model NotesExample.Models.Note
      @using (Html.BeginForm("AddNewNote", "Home"))
      {
          <div>
          <label>New Note Text:</label>@Html.TextBoxFor(p => p.Text)
          </div>
          <input type="submit" name="AddNewNote" value="Add New Note" />
      }