VS 2012 MVC-使用一个视图&;更新和创建功能的模型

本文关键字:更新 amp 创建 模型 功能 视图 一个 MVC- 2012 VS | 更新日期: 2023-09-27 18:28:47

我是C#和MVC的新手,是从PHP背景进入Visual Studio环境的。我四处摸索,但还是到了那里。我需要帮助来理解一些基本概念,毫无疑问,这是一项非常笨拙的努力,但帮助我解决这一问题将有助于我理解事情是如何运作的。

我有一个SQL数据库,通过添加ADO.NET实体类模型连接到VS2012 web项目(C#)。只需说,这一端工作没有问题,自动生成的默认CRUD视图也工作没有问题。

用例:

我想要一个网页,在那里用户可以看到从数据库中提取的项目列表。这已经在默认的"索引"视图中实现了,但我也希望该列表可以随时编辑,而不必为每个项目输入"编辑"视图。因此,我将列表HTML更改为表单,并为"更新"提交设置了ActionName。这也没问题:

型号:

namespace Library3.DAL {
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    public partial class PrmTbl_Level {
        public PrmTbl_Level() {
            this.Tbl_Books = new HashSet<Tbl_Book>();
        }
        [Required]
        [Display(Name = "ID")]
        public int LevelID { get; set; }
        [Required]
        [Display(Name = "Description")]
        public string LevelDesc { get; set; }
        [Required]
        [Display(Name = "Entered By")]
        public string EnteredBy { get; set; }
        public Boolean Active { get; set; }
        public virtual ICollection<Tbl_Book> Tbl_Books { get; set; }
    }
}

视图:

@model IEnumerable<Library3.DAL.PrmTbl_Level>

@using (Html.BeginForm("Update", "ReaderLevel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
    <table>
        <thead>
            <tr>
                <th> @Html.DisplayNameFor(model => model.LevelID) </th>
                <th> @Html.DisplayNameFor(model => model.LevelDesc) </th>
                <th> @Html.DisplayNameFor(model => model.EnteredBy) </th>
                <th> @Html.DisplayNameFor(model => model.Active) </th>
            </tr>
        </thead>
        @foreach (var item in Model) {
            var thisID = item.LevelID;
            var thisDesc = item.LevelDesc;
            var thisEnteredBy = item.EnteredBy;
            var thisActive = item.Active;
            <tr>
                <td class="tdsm centered fade"> @thisID </td>
                <td> <input type="text" name="@(thisID + ".desc")" value="@thisDesc" /> </td>
                <td class="tdmed centered fade"> @thisEnteredBy </td>
                <td class="tdsm centered">
                    @{
                        if(@thisActive) {
                            <text><input type="checkbox" name="@(thisID + ".active")" value="true" checked="checked" /></text>
                        }
                        else {
                            <text><input type="checkbox" name="@(thisID + ".active")" value="true" /></text>
                        }
                    }
                </td>
            </tr>
        }all of this
    </table>
    <p>
        <input type="submit" value="Update" />
    </p>
</fieldset>
}

控制器:

namespace Library3.Controllers {
    public class ReaderLevelController : Controller {
        private NSSchoolLibraryEntities db = new NSSchoolLibraryEntities();
        public ActionResult Index() {
            ViewBag.Title = "Reader Levels";
            return View(db.PrmTbl_Levels.ToList());
        } 

        [HttpPost, ActionName("Update")]
        [ValidateAntiForgeryToken]
        public ActionResult Update(FormCollection MyArray) {
                (... Process UPDATE submission ...)
                db.SaveChanges();
            }
        }
        return RedirectToAction("Index");
        }
    }
}

现在我想在列表的顶部放一个空字段,这样就可以创建新的条目。这基本上意味着一个视图文件现在将同时满足创建和更新功能的需要。我插入了以下HTML:

@using (Html.BeginForm("New", "ReaderLevel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <table>
            <tr>
                <td class="tdsm centered fade">
                    @Html.EditorFor(model => model.LevelID)
                    @Html.ValidationMessageFor(model => model.LevelID)</td>
                <td><input type="text" name="desc" />
                    @Html.EditorFor(model => model.LevelDesc)
                    @Html.ValidationMessageFor(model => model.LevelDesc)</td>
                <td class="tdmed centered fade">
                    @Html.EditorFor(model => model.EnteredBy)
                    @Html.ValidationMessageFor(model => model.EnteredBy)</td>
                <td class="tdsm centered">
                    @Html.EditorFor(model => model.Active)
                    @Html.ValidationMessageFor(model => model.Active)</td>
            </tr>
        </table>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

问题是,这里引用的模型应该是针对PrmTbl_Level类的一个新实例,而不是使用现有的IEnumberable从表中吐出现有的数据(至少我认为这就是问题所在!)。

默认的单独Create视图通过@model(sans IEnumberable)引用名称空间,数据作为单个对象(public ActionResult Create(PrmTbl_Level prmtbl_level))返回,然后轻松地保存到数据库(db.PrmTbl_Levels.Add(prmtbl_level);)-如何使用一个@model语句实现同样的目的?(ELI5)。非常感谢所有的帮助——无论是在实践中还是在所涉及的概念上!

VS 2012 MVC-使用一个视图&;更新和创建功能的模型

简而言之,您不应该为模型使用IEnumerable<Library3.DAL.PrmTbl_Level>,而应该创建一个自定义类,该类表示列表(要像当前一样显示和编辑)以及一个额外的PrmTbl_Level,您可以填充它来创建新的实体/行。

所以,像这样的东西:

public class MyCustomModel
{
    public MyCustomModel()
    {
        MyList = new List<PrmTbl_Level>();
        MyItemToCreate = new PrmTbl_Level();
    }
    public List<PrmTbl_Level> MyList { get; set; }
    public PrmTbl_Level MyItemToCreate { get; set; }
}

现在,您的强类型模型是MyCustomModel,您需要更改视图以正确引用新模型(例如model => model.LevelID变为model => model.MyList.LevelID)。

不是一个完整的解决方案,但应该让你开始。

要在同一列表视图中添加Create视图,可以使用分部视图。并将这个局部视图添加到列表视图的顶部,这样可以解决您的问题。创建新条目所需的所有字段都应处于局部视图中。

检查这些链接可能会给你一些帮助

检查这些链接可能会给你一些帮助