如何在单个视图上创建和显示模型数据
本文关键字:显示 模型 数据 创建 单个 视图 | 更新日期: 2023-09-27 18:27:10
目标是能够在同一视图中从模型创建和显示无序列表项。
这就是我到目前为止
所拥有的型号:注释.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; }
}
}
首页控制器.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。
我很困惑。
索引方法返回笔记集合
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 个属性创建输入。 您可以在Views/Shared/EditorTemplates
中创建名为 Notes.cshtml
的自定义EditorTemplate
以自定义显示
@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
本身创建一个视图模型,以便您可以添加验证属性
这是因为您正在迭代
@for (var d in Model.Text)
{
<ul>
<li>
@d
</li>
</ul>
}
并且您的模型仅声明
@model NoteTaking.Models.Notes
尝试使其成为可枚举类型:
@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>
使用分部视图,您可以将模型作为模型的集合,这是一个非常粗略的示例,但我模拟了一些使用 EF6 和快速代码优先数据库工作的东西......
它不是世界上最快的方法,但演示了如何从 EntityFramework 返回结果集合,这些结果集合绑定到视图作为模型。 以及如何添加新项目。 可以对此进行许多调整。
一个这样的调整:返回调用AsNoTracking的模型,这样它们就不会被跟踪(无论如何都无法跨回发跟踪(。
-
视图
/views/home/index.cshtml/views/Shared/NewNote.cshtml/views/Shared/Notes.cshtml
-
控制器
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("~/"); } }
-
型
public class Note { public int Id { get; set; } public string Text { get; set; } public long Time { get; set; } }
-
模型 EF 配置类
public class NoteConfig : EntityTypeConfiguration<Note> { public NoteConfig() { this.HasKey(p => p.Id).Property(p1 => p1.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //this.HasRequired(p => p.Text); } }
-
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 }
-
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>
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> } }
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" /> }