Нет данных, сохраненных в частичном представлении - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь сохранить данные, обновленные в частичном представлении, вызываемом в родительском действии Редактировать.Но обновленные данные не сохраняются.

У меня есть родительская таблица '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:

@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");}
}

Теперь, когда я нажимаю кнопку «Сохранить» (отправить), данные не сохраняются в течение нескольких дней, например, дней!Зачем?и как решить пожалуйста?

и как вернуть Select с возвращенными значениями из MkhType?(используя MkhCodeNavigation, я думаю)

Это то, что происходит, когда я ставлю точку останова в методе Edit в 'Edited' var и пытаюсь обновить поле 'days' в партиале: Post Edit Method

, как вы заметили. Отредактированная переменная равна нулю.это означает, что данные не передаются в контроллер?как решить?

1 Ответ

0 голосов
/ 04 февраля 2019

Только что понял, что ты сделал ....

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, за исключением 1 за один раз.Сохраните и повторите, перезагрузите страницу из другого Edit.Сохранение Mkh может также столкнуться с проблемами с графиком в EF. Но я думаю, что вы учли это с помощью настроенных вами отношений.

...