未在部分视图中保存数据

时间:2019-02-02 05:27:40

标签: asp.net-core-mvc entity-framework-core

我正在尝试保存在父级Edit动作中调用的局部视图上更新的数据。但更新的数据不保存。

我有一个父表“ Nz”和一个子表“ Mkh”,并尝试在“ Nz”编辑操作中检索它的所有数据,作为部分视图让用户更新它。 数据已正确检索,但是当用户更新数据并按提交时,不会保存任何数据! 另一方面,我想检索返回值不是普通文本项的“选择”项。

这是我的代码:

//Nz model:
    public partial class Nz
    {
        public Nz()
        {
            Mkh = new HashSet<Mkh>();
        }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:#########}")]
        public decimal TxtId { get; set; }
        public int Sn { get; set; }
        public string FullName { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime? BirthDate { get; set; }
        public int SexCode { get; set; }
        public string InsertUser { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime InsertDate { get; set; }

        public ICollection<Mkh> Mkh { get; set; }
    }
//Mkh Model:
    public partial class Mkh
    {
        public int Sn { get; set; }
        public decimal TxtId { get; set; }
        public int MkhCode { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime MkhDate { get; set; }
        public int Days { get; set; }
        public string Notes { get; set; }
        public string InsertUser { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
        public DateTime InsertDate { get; set; }


        public MkhType MkhCodeNavigation { get; set; }
        public Nz Txt { get; set; }
    }
//MkhType Model:
    public partial class MkhType
    {
        public MkhType()
        {
            Mkh = new HashSet<Mkh>();
        }

        public int MkhCode { get; set; }
        public string MkhName { get; set; }
        public string InsertUser { get; set; }
        public DateTime InsertDate { get; set; }

        public ICollection<Mkh> Mkh { get; set; }
    } 

下面是我的上下文:

public partial class NozContext : DbContext
{
    public NozContext()
    {
    }

    public NozContext(DbContextOptions<NozContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Mkh> Mkh { get; set; }
    public virtual DbSet<MkhType> MkhType { get; set; }
    public virtual DbSet<Nz> Nz { get; set; }
    public virtual DbSet<Sex> Sex { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Server=My-PC\\SQLEXPRESS;Database=Noz;Trusted_Connection=True;");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Mkh>(entity =>
        {
            entity.HasKey(e => e.Sn);

            entity.ToTable("Mkh");

            entity.Property(e => e.Sn).HasColumnName("sn");

            entity.Property(e => e.Days).HasColumnName("days");

            entity.Property(e => e.InsertDate)
                .HasColumnName("insert_date")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.InsertUser)
                .IsRequired()
                .HasColumnName("insert_user")
                .HasMaxLength(20)
                .HasDefaultValueSql("(N'any')");

            entity.Property(e => e.MkhCode).HasColumnName("Mkh_code");

            entity.Property(e => e.MkhDate)
                .HasColumnName("Mkh_date")
                .HasColumnType("date");

            entity.Property(e => e.Notes).HasColumnName("notes");

            entity.Property(e => e.TxtId)
                .HasColumnName("txt_id")
                .HasColumnType("numeric(9, 0)");

            entity.HasOne(d => d.MkhCodeNavigation)
                .WithMany(p => p.Mkh)
                .HasForeignKey(d => d.MkhCode)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Mkh_Mkh_type");

            entity.HasOne(d => d.Txt)
                .WithMany(p => p.Mkh)
                .HasForeignKey(d => d.TxtId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Mkh_Nz");
        });

        modelBuilder.Entity<MkhType>(entity =>
        {
            entity.HasKey(e => e.MkhCode);

            entity.ToTable("Mkh_type");

            entity.Property(e => e.MkhCode).HasColumnName("Mkh_code");

            entity.Property(e => e.InsertDate)
                .HasColumnName("insert_date")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.InsertUser)
                .IsRequired()
                .HasColumnName("insert_user")
                .HasMaxLength(20)
                .HasDefaultValueSql("(N'any')");

            entity.Property(e => e.MkhName)
                .IsRequired()
                .HasColumnName("Mkh_name")
                .HasMaxLength(50);
        });

        modelBuilder.Entity<Nz>(entity =>
        {
            entity.HasKey(e => e.TxtId);

            entity.ToTable("Nz");

            entity.Property(e => e.TxtId)
                .HasColumnName("txt_id")
                .HasColumnType("numeric(9, 0)");

            entity.Property(e => e.BirthDate)
                .HasColumnName("birth_date")
                .HasColumnType("date");


            entity.Property(e => e.InsertDate)
                .HasColumnName("insert_date")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.InsertUser)
                .IsRequired()
                .HasColumnName("insert_user")
                .HasMaxLength(20)
                .HasDefaultValueSql("(N'any')");

            entity.Property(e => e.SexCode).HasColumnName("sex_code");

            entity.Property(e => e.Sn)
                .HasColumnName("sn")
                .ValueGeneratedOnAdd();

            entity.HasOne(d => d.SexCodeNavigation)
                .WithMany(p => p.Nz)
                .HasForeignKey(d => d.SexCode)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Nz_sex");
        });

        modelBuilder.Entity<Sex>(entity =>
        {
            entity.HasKey(e => e.SexCode);

            entity.ToTable("sex");

            entity.Property(e => e.SexCode).HasColumnName("sex_code");

            entity.Property(e => e.SexName)
                .IsRequired()
                .HasColumnName("sex_name")
                .HasMaxLength(10);
        });

        modelBuilder.Entity<Nz>()
        .HasAlternateKey(x => x.Sn).HasName("IX_Sn");
    }
}

和NzController动作:

public class NzController : Controller
{
    private readonly NozContext _context;

    public NzController(NozContext context)
    {
        _context = context;
    }
// ........ Some Code here .............
public async Task<IActionResult> Edit(decimal? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        //var Nz = await _context.Nz.FindAsync(id);
        var Nz = await _context.Nz
                     .Include(n => n.Mkh)
                     .ThenInclude(m => m.MkhCodeNavigation)
                     .FirstOrDefaultAsync(n => n.TxtId == id.Value);
        if (Nz == null)
        {
            return NotFound();
        }
        ViewData["SexCode"] = new SelectList(_context.Sex, "SexCode", "SexName", Nz.SexCode);
        return View(Nz);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(decimal id, [Bind("TxtId,Sn,FullName,BirthDate,SexCode,InsertUser,InsertDate")] Nz Nz)
    {
        if (id != Nz.TxtId)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                var Edited = new Nz()
                {
                    TxtId = Nz.TxtId,
                    BirthDate = Nz.BirthDate,
                    InsertDate = Nz.InsertDate,
                    InsertUser = Nz.InsertUser,
                    FullName = Nz.FullName,
                    SexCode = Nz.SexCode,
                    Mkh = Nz.Mkh.Where(m => m.TxtId == Nz.TxtId).ToList(),
                };
                _context.Update(Edited);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!NzExists(Nz.TxtId))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        ViewData["SexCode"] = new SelectList(_context.Sex, "SexCode", "SexName", Nz.SexCode);
        return View(Nz);
    }

局部视图“ EditNz”:

@model IEnumerable<Mkh>

<h4>MkhTbl</h4>
<hr />
    <table class="table">
        <thead>
            <tr>
                <th>
                    Date
                </th>
                <th>
                    Days
                </th>
                <th>
                    Notes
                </th>
                <th>
                    Mkh Type
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {

                <tr>
                    <td> 
                        @Html.EditorFor(modelItem => item.MkhDate)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Days)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Notes)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.MkhCodeNavigation.MkhName)
                    </td>
                </tr>
            }
        </tbody>
    </table>

    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    } 

以及NzController中Edit视图中上一个部分的调用:

@model NozCoreWebApp5.Models.Nz
@*@{
        ViewData["Title"] = "Edit";
    }*@

<form asp-action="Edit">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="TxtId" />
    <input type="hidden" asp-for="InsertDate" />
    <input type="hidden" asp-for="InsertUser" />

    <hr />


    <div class="row">
        <div class="col-md-3">
            <label asp-for="FullName" class="control-label">Full Name</label>
            <input asp-for="FullName" class="form-control" readonly/>
            <span asp-validation-for="FullName" class="text-danger"></span>
        </div>
        <div class="col-md-3">
            <label asp-for="BirthDate" class="control-label">Birth Date</label>
            <input asp-for="BirthDate" class="form-control" readonly/>
            <span asp-validation-for="BirthDate" class="text-danger"></span>
        </div>
        <div class="col-md-3">
            <label asp-for="SexCode" class="control-label">Sex</label>
            <select asp-for="SexCode" class="form-control" asp-items="ViewBag.SexCode"></select>
            <span asp-validation-for="SexCode" class="text-danger"></span>
        </div>
    </div>

    <br />
    <div class="form-group">
        <input type="submit" value="Save" class="btn btn-default" />
    </div>
</form>
<div>
    <a asp-action="Index">Nz List</a>
</div>

@{ await Html.RenderPartialAsync("~/Views/Mkhalfa/EditNz.cshtml", Model.Mkh); }

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

现在,当我按下“保存”按钮(提交)时,部分数据将无法保存,例如几天!为什么?如何解决好吗?

以及如何返回从MkhType返回的值进行选择? (我认为使用MkhCodeNavigation)

这是当我把一个断点在“编辑”变种编辑方法,并试图在部分更新“天”领域发生什么事: Post Edit Method

当你看到编辑var为空。这是否意味着没有传递给控制器​​的数据?该怎么解决?

1 个答案:

答案 0 :(得分:0)

刚意识到你做了什么。...

public async Task<IActionResult> Edit(decimal id, [Bind("TxtId,Sn,FullName,BirthDate,SexCode,InsertUser,InsertDate")] Nz Nz)

这里缺少的是绑定列表中的Mkh,例如不绑定不填充。因此是空的结果。您可以保留绑定,但需要在列表中添加Mkh

public async Task<IActionResult> Edit(decimal id, [Bind("TxtId,Sn,FullName,BirthDate,SexCode,Mkh,InsertUser,InsertDate")] Nz Nz)

当前设置的另一件事不允许一次多次进入Mkh集合,一次只能一次。保存并重复,从另一个编辑重新加载页面。 Mkh的保存也可能会遇到EF的图形问题。。但是我认为您已经用设置的关系解决了这个问题。

相关问题