c# - 如何从 ASP.NET MVC 中的相关表更新表属性

标签 c# asp.net asp.net-mvc entity-framework

我最近开始使用 ASP.NET,我必须说我非常喜欢它。但在每一段关系中,你都必须时不时地遇到一些障碍。这是我的:

我的起始项目包括创建用于管理学生的简单学校系统。我有几个表(学生、学生地址、成绩和类(class))。

这里有两个有问题的表:

1)学生表:

  public Student()
        {

            this.Courses = new HashSet<Course>();
        }

        public int StudentId { get; set; }

        [Required] 
        [StringLength(50, MinimumLength = 2, ErrorMessage = "The name must have over 2 and under 50 characters!")] // stavlja ograničenje na duljinu stringa u bazi
        public string Name { get; set; }

        [Required] 
        [StringLength(50, MinimumLength = 2, ErrorMessage = "The name must have over 2 and under 50 characters!")]
        public string Surname { get; set; }

        public int CurrentGradeId { get; set; }
        public Grade CurrentGrade { get; set; }
        public virtual StudentAdress Address { get; set; }

        public virtual ICollection<Course> Courses { get; set; }

2) StudentAddress 表:

        public int StudentId { get; set; }
        public string Address1 { get; set; }
        public string Adress2 { get; set; }
        public string City { get; set; }
        public int ZipCode { get; set; }
        public string Country { get; set; }

        public virtual Student Student { get; set; }

简而言之,我正在尝试更新 StudentAddresses 属性(更准确地说是 Student 的 Address1 属性),同时在 Student 编辑 Action Method 中。

这是编辑学生的 View :

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Student</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.StudentId)

    <div class="form-group">
        @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Surname, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Surname, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Surname, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CurrentGradeId, "CurrentGradeId", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("CurrentGradeId", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CurrentGradeId, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.Address.Address1, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address.Address1, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Address.Address1, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
</div>

最后是 StudentsController 的编辑操作方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "StudentId,Name,Surname,CurrentGradeId")] Student student  )
{

    if (ModelState.IsValid)
    {

        // getting student id for current studentid
        StudentAdress addresa = db.Addresses.Find(student.StudentId);

        // trying to bind input value
        addresa.Address1 = student.Address.Address1.ToString();

        // saving new value in StudentAddresses field Address1
        db.Entry(addresa).State = EntityState.Modified;
        db.SaveChanges();

        db.Entry(student).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.CurrentGradeId = new SelectList(db.Grades, "GradeId", "GradeName", student.CurrentGradeId);
    return View(student);
}

因此,在 Edit 方法中,我想在 Student 表的 Edit 方法中保存 Address1 的新输入值。或者更简单地说,我想在编辑 Student 类时更新 StudentAddress 类中的字段 Address1

更新 1

那么,假设我已经弄明白了,但我仍然想知道这样做是否合适和正确。

在 Student Edit 操作方法中,我添加了 addresa.Address1 = Request.Form["Address.Address1"];,其中我使用属性 name=Address.Address1 更新了字段它做了一个把戏,但我想知道这是否是正确的做法?

记住我已经试过了

**addresa.Address1 = student.Address.Address1;** 

但是使用这种“更清洁”的方法给了我:

System.NullReferenceException: Object reference not set to an instance of an object.

我可以使用其他方法更新 Address.Address1 字段吗?

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "StudentId,Name,Surname,CurrentGradeId")] Student student  )
        {

            if (ModelState.IsValid)
            {


                StudentAdress addresa = db.Addresses.Find(student.StudentId);

                // newly added line
                addresa.Address1 = Request.Form["Address.Address1"];
                db.Entry(addresa).State = EntityState.Modified;
                db.SaveChanges();

                db.Entry(student).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.CurrentGradeId = new SelectList(db.Grades, "GradeId", "GradeName", student.CurrentGradeId);
            return View(student);
        }

最佳答案

你的关系是错误的。

在你的StudentAddress模型我们可以看到StudentId外键表示 Student 之间的关系和 StudentAddress是一对多。但是在你的Student你的型号virtual StudentAdress Address应该是 ICollection<StudentAdress> Addresses .

在您的添加/编辑中,您可以这样做:

var student = context.Student.Find(1);

student.Addresses.Add(new StudentAdress {
    Address1 = "Ul. Janka Leskovara",
    City = "Pregrada",
    ZipCode = 49218,
    Country = "Hrvatska"
});

context.SaveChanges();

关于c# - 如何从 ASP.NET MVC 中的相关表更新表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355226/

相关文章:

javascript - ASP.NET MVC : Javascript error logging in production environement

asp.net-mvc - NuGet:调用 COM 组件返回了错误 HRESULT E_FAIL

c# - 在下拉列表 Razor 中设置所选选项

c# - LoadLibrary 不会因缺少 DLL : why? 而失败

c# - 为什么谷歌地图在几次回复后卡住页面

jquery - visual studio 2010 jquery 和 ScriptManager 导致错误

asp.net - 限制并发还是不限制并发? (在单个 ASP.NET 请求内)

c# - 最小化服务请求

c# - Linq 日期时间差和

html - cshtml按钮上下对齐