如何以一种形式发布两个或多个模型?

2024-06-19

我正在为一个项目开发互联网课程计划应用程序。该课程计划是根据以下模型构建的(使用数据库优先方法中的实体框架生成):

public partial class Subject
{
    public int Id { get; set; }
    public string Hour { get; set; }
    public string Name { get; set; }
    public int DayId { get; set; }
    [Required]
    public int PlanId { get; set; }

    public virtual Day Day { get; set; }
    public virtual Plan Plan { get; set; }
}

public partial class Plan
{
    public Plan()
    {
        this.Przedmiot = new HashSet<Subjects>();
    }

    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

    public virtual ICollection<Subject> Subject { get; set; }
}

I have no problems with displaying both models in one View, but I can't seem to figure out how to post both models to database when creating new plan. I want my View to look something like this: My View

所以我的问题是这里最好的方法是什么,以及如何在数据库的计划表中创建一条记录,以及在这个视图中链接到它的许多主题记录。

Edit:根据要求使用我的显示视图进行代码(省略了不必要的部分,因为它相当长):

@model IEnumerable<Lesson_plan.DAL.Subject>
<table style="border: 1px solid black; margin: 40px; width: 100%;">
    <tr>
        <th>Hours</th>
        <th>Monday</th>
        <th>Tuesday</th>
        <th>Wednesday</th>
        <th>Thursday</th>
        <th>Friday</th>
        <th>Saturday</th>
        <th>Sunday</th>
    </tr>

    @{
        if (Model != null)
        {
            var r = 1;
            var t = 1;
            List<string> hours = new List<string>();
            foreach (var subject in Model)
            {
                if (!hours.Contains(subject.Hour))
                {
                    <tr>
                        <td>
                            <textarea>    
                            @Html.DisplayFor(modelItem => subjest.Hour)
                            @{ hours.Add(subject.Hour); }
                            </textarea>
                        </td>

                        <td>
                            <textarea>  
                            @foreach (var subjectName in Model)
                            {
                                if (subjectName.Day.DayOfTheWeek.Equals("Monday") &&
                                    subject.Hour.Equals(subjetName.Hour))
                                {
                                    @Html.DisplayFor(modelItem => subject.Name)
                                }
                            }   
                            </textarea>
                        </td>

//and so on for every day 

                        }
                    </tr>
                    r++;
                }
            }
        }
    }
</table>

我的 Controller 类的代码(我使用 Create 方法做了一些实验,但我在这里发布原始方法):

namespace Lesson_plan.Controllers
{
    public class PlansController : Controller
    {
        private readonly LessonPlanEntities db = new LessonPlanEntities();

        // GET: Plans
        public ActionResult Index()
        {
            var plans = db.Plan.ToList();
            return View(plans);
        }

        // GET: Plans/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
                return Create();
            var subjects = db.Subject.
                Where(x => x.PlanId == id).
                OrderByDescending(x => x.Hour).ToList();
            if (subjects.Count > 0)
                ViewBag.Title = subjects[0].Plan.Name;
            return View(subjects);
        }

        // GET: Plans/Create
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Plan plan)
        {
            if (ModelState.IsValid)
            {
                db.Plan.Add(plan);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(plan);
        }

        // GET: Plans/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            var plan = db.Plan.Find(id);
            if (plan == null)
                return HttpNotFound();
            return View(plan);
        }

        // POST: Plans/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Nazwa")] Plan plan)
        {
            if (ModelState.IsValid)
            {
                db.Entry(plan).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(plan);
        }

        // GET: Plans/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            var plan = db.Plan.Find(id);
            if (plan == null)
                return HttpNotFound();
            return View(plan);
        }

        // POST: Plans/Delete/5
        [HttpPost]
        [ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            var plan = db.Plan.Find(id);
            db.Plan.Remove(plan);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
                db.Dispose();
            base.Dispose(disposing);
        }
    }
}

Edit2使用表单创建视图的代码:

@model Lesson_plan.DAL.Plan

@using (Html.BeginForm("Create", "Plans"))
{
    <div>
        @Html.LabelFor(plan => plan.Name)<br/>
        @Html.TextAreaFor(plan => plan.Name)
    </div>
    <table style="border: 1px solid black; margin: 40px; width: 100%;">
        <tr>
            <th>Hours</th>
            <th>Monday</th>
            <th>Tuesday</th>
            <th>Wednesday</th>
            <th>Thursday</th>
            <th>Friday</th>
            <th>Saturday</th>
            <th>Sunday</th>
        </tr>
            @{
                for (int i = 0; i < 7; i++)
                {
                    <tr>  
                        //what sould i put here ?                    
                        <td><textarea></textarea></td>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                        <th><textarea></textarea></th>
                    </tr>
                }
            }
    </table>
    <p>
        <a type="button" class="btn btn-info" [email protected] /cdn-cgi/l/email-protection("Index")>Back</a>
        <input type="submit" value="Create"/>
    </p>
}

最好的方法是设计一个 ViewModel 类,它可以保存表单上需要提交的计划和/或主题的所有数据。

在接收此 ViewModel 的操作方法中,您可以分离数据,并基于此执行将其存储在数据库中所需的任何插入和/或更新。

只有控制器应该了解您的数据库类。 ViewModel 和数据库对象之间的所有映射都应该由控制器完成,并且 View 不应该受此困扰或阻碍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以一种形式发布两个或多个模型? 的相关文章

  • C++ 构造函数根据参数类型调用另一个构造函数

    我有这门课 class XXX public XXX struct yyy XXX std string private struct xxx data 第一个构造函数 使用结构 很容易实现 第二 我可以将一个字符串以特定的格式分开 解析
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 带有成员 (operator[]) 函数的 invoke_result

    如何为成员函数正确调用invoke result 或者专门用于运算符成员函数 我试过std invoke result
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • C++ 访问嵌套类的私有成员

    标题可能有点误导 我有以下问题 我有一棵由叶子和内部节点组成的树 用户应该能够在叶子中存储任何信息and该树有一些方法可以获取一组用户定义的值 并且需要在恒定时间内 未摊销 访问相应的叶子 我提出了以下想法 但它不起作用 因为不幸的是我无法
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • 使用 ServiceStack JsonSerializer 反序列化包含 Dictionary 属性的类型

    下面的代码片段显示了我可以实现此目的的两种方法 第一个是使用MsgPack https github com msgpack msgpack cli第二个测试是使用ServiceStack 的 JSONSerializer https gi
  • dotnet core 创建文件名中不含“CoreFxPipe_”的命名管道

    使用以下命令创建命名管道时命名管道客户端流 or 命名管道服务器流dotnet core 的类中 关联的 管道 看起来实际上是一个套接字 已自动将 CoreFxPipe 添加到文件名的前面 有没有一种非黑客的方法来防止这种行为 我只是希望文
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • “未定义对 clrscr() 的引用;” [复制]

    这个问题在这里已经有答案了 include
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • boost::bind 会导致开销吗?

    我目前正在从事网络软件方面的工作 它有一个主要类 server这显然代表一个服务器实例 A server实例可以发送请求 并通过回调通知用户响应 代码如下 class server public typedef boost function
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • 实现多个接口的 Service Fabric Actor 接口

    我正在构建一个应用程序 其中有多个不同的参与者类型 这些参与者类型对于某些不同的数据对象具有相同类型的行为 CRUD 为了更轻松地创建处理此问题的代码 我尝试创建一个这些参与者可以实现的接口 这意味着我有一个看起来像这样的参与者界面 pub
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安
  • 系统.安全.加密与 PCLCrypto

    我们正在删除系统中的许多共享功能并将其移植到 PCL 库中 我在使用 PCLCrypto 时遇到问题 我正在获取数据库中的一些现有数据 并尝试使用相同的算法对其进行解密 我得到了值 但末尾有 16 个额外字节 这些字节都是垃圾 参见下面的代
  • Interlocked.CompareExchange 可以抛出 NullReferenceException 吗?

    From https msdn microsoft com en us library bb297966 v vs 110 aspx https msdn microsoft com en us library bb297966 v vs

随机推荐