MVC4 - привязка модели списка частичного просмотра во время отправки в главный вид - PullRequest
0 голосов
/ 09 мая 2019

У меня есть модель представления, в которой есть список дочерних моделей для визуализации частичного представления (ниже).

public class PRDocument
{
        [Key]
        [Column(Order = 0)]
        public int Id { get; set; }

        [DisplayName("Vendor Name")]
        [Column(Order = 2)]
        public int VendorId { get; set; }

        public virtual ICollection<PRDocumentQuotation> PRDocumentQuotations { get; set; }

        [NotMapped]
        public List<PRDocumentQuotation> Quotations { get; set; }

        public PRDocument()
        {
            Quotations = new List<PRDocumentQuotation>();
        }
}

    public class PRDocumentQuotation
    {
        [Key]
        [Column(Order = 0)]
        public int Id { get; set; } 

        [Required]
        [Column(Order = 1)]
        public int PRDocumentId { get; set; }

        [Display(Name = "Uploaded File")]
        [Column(Order = 2)]
        public string FileName { get; set; }
    }

И в частичном представлении, представленном так:

@Html.Partial("_PRDocs", Model.Quotations)

Вот мое частичное представление.

@model IEnumerable<JKLLPOApprovalApp.Models.PRDocumentQuotation>

<table class="table">
   <tr>
       <th>
           @Html.DisplayNameFor(model => model.FileName)
       </th>

       <th></th>
   </tr>

@foreach (var item in Model) {
   <tr>
       @Html.HiddenFor(modelItem => item.PRDocumentId)
       <td>
           @Html.DisplayFor(modelItem => item.FileName)
       </td>     
       <td>
           @Html.ActionLink("Delete", "Delete", new { id=item.Id })
       </td>
   </tr>
}

</table>

И действия контроллера

  [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(PRDocument pRDocument)
        {
            if (ModelState.IsValid)
            {
                pRDocument.PRDocumentQuotations = pRDocument.Quotations;
                db.tbl_PRDocuments.Add(pRDocument);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(pRDocument);
        }

Просмотр данных Главный вид

@model JKLLPOApprovalApp.Models.PRDocument

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

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

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

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

        @Html.Partial("_PRDocs", Model.Quotations)

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>




}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Я хочу получить список данных частичного просмотра (PRDocumentQuotation) в действии Создать, привязанном к основной модели (PRDocument).Как я могу это сделать?

1 Ответ

1 голос
/ 09 мая 2019

Интересный вопрос:)

Проблема заключалась в том, что Model привязка к списку должна иметь уникальные имена. Итак, сгенерированный HTML должен выглядеть так:

<input id="Quotations_0__PRDocumentId" name="Quotations[0].PRDocumentId" type="hidden" value="0">

<input id="Quotations_1__PRDocumentId" name="Quotations[1].PRDocumentId" type="hidden" value="0">

Рекомендованным решением является использование шаблонов редактора, отметьте это и это .

Но я даю альтернативное решение ниже, используя цикл for для создания уникальных имен с индексом, взятым из этого поста, который столкнулся с той же проблемой.

На главном экране:

Передайте основную модель вместо

@Html.Partial("_PRDocs", Model)

Частичное представление:

@model JKLLPOApprovalApp.Models.PRDocument

<table class="table">
    @if (Model.Quotations != null)
    {
        for (var i = 0; i < Model.Quotations.Count(); i++)
        {
            <tr>
                <th>
                    @Html.DisplayNameFor(model => Model.Quotations[i].FileName)
                </th>

                <th></th>
            </tr>

            <tr>
                @Html.HiddenFor(modelItem => Model.Quotations[i].PRDocumentId)
                <td>
                    @Html.DisplayFor(modelItem => Model.Quotations[i].FileName)
                </td>
                <td>
                    @Html.ActionLink("Delete", "Delete", new { id = Model.Quotations[i].Id })
                </td>
            </tr>
        }
    }

</table>

Надежда помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...