Как передать список объектов вместо одного объекта методу действия POST

У меня есть следующие методы действий GET и POST:

public ActionResult Create(int visitid)
{
    VisitLabResult vlr = new VisitLabResult();
    vlr.DateTaken = DateTime.Now;
    ViewBag.LabTestID = new SelectList(repository.FindAllLabTest(), "LabTestID", "Description");

    return View();
} 

//
// POST: /VisitLabResult/Create

[HttpPost]
public ActionResult Create(VisitLabResult visitlabresult, int visitid)
{
    try
    {
        if (ModelState.IsValid)
        {
            visitlabresult.VisitID = visitid;
            repository.AddVisitLabResult(visitlabresult);
            repository.Save();
            return RedirectToAction("Edit", "Visit", new { id = visitid });
        }
    }
    catch (DbUpdateException) {

        ModelState.AddModelError(string.Empty, "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");

    }
    ViewBag.LabTestID = new SelectList(repository.FindAllLabTest(), "LabTestID", "Description", visitlabresult.LabTestID);

    return View(visitlabresult);
}

В настоящее время в представлении отображаются связанные поля для создания только одного объекта, но как я могу определить список объектов вместо одного объекта, чтобы иметь возможность быстро добавить, например, 10 объектов по одному и тому же запросу «Создать». > Представление My Create выглядит так: -

@model Medical.Models.VisitLabResult

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@section scripts{
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
}
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>VisitLabResult</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.LabTestID, "LabTest")
        </div>
        <div class="editor-field">
            @Html.DropDownList("LabTestID", String.Empty)

person john Gu    schedule 30.04.2012    source источник


Ответы (2)


Ваше мнениеМодель

public class LabResult
{
    public int ResultId { get; set; }
    public string Name { get; set; }
    //rest of the properties
}

Ваш контроллер

public class LabController : Controller
{
    //
    // GET: /Lab/ns

    public ActionResult Index()
    {
        var lst = new List<LabResult>();
        lst.Add(new LabResult() { Name = "Pravin", ResultId = 1 });
        lst.Add(new LabResult() { Name = "Pradeep", ResultId = 2 });

        return View(lst);
    }

    [HttpPost]
    public ActionResult EditAll(ICollection<LabResult> results)
    {
        //savr results here
        return RedirectToAction("Index");
    }

}

Ваше мнение

@model IList<MvcApplication2.Models.LabResult>
@using (Html.BeginForm("EditAll", "Lab", FormMethod.Post))
{
    <table>
        <tr>
            <th>
                ResultId
            </th>
            <th>
                Name
            </th>
        </tr>
        @for (int item = 0; item < Model.Count(); item++)
        {
            <tr>
                <td>
                    @Html.TextBoxFor(modelItem => Model[item].ResultId)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => Model[item].Name)
                </td>
            </tr>
        }
    </table>
    <input type="submit" value="Edit All" />
}

Ваше представление будет отображаться следующим образом: это соглашение об именах на основе массива позволяет Defaultbinder преобразовать его в ICollection в качестве первого параметра действия EditAll.

<tr>
<td>
        <input name="[0].ResultId" type="text" value="1" />
    </td>
    <td>
        <input name="[0].Name" type="text" value="Pravin" />
    </td>
    </tr>
    <tr>
    <td>
        <input name="[1].ResultId" type="text" value="2" />
    </td>
    <td>
        <input name="[1].Name" type="text" value="Pradeep" />
    </td>
    </tr>
person Pravin Pawar    schedule 01.05.2012
comment
Если LabResult содержит другие объекты List‹T›, то как я могу справиться с этим? - person Sebastian; 11.01.2014
comment
В этом случае будет другой уровень вложенности, когда типы ввода будут отображаться с [0].Customers[0].CustomerName и так далее. - person Pravin Pawar; 12.01.2014

Если я правильно понял ваш вопрос,

вы хотите изменить свое представление, чтобы оно было списком вашего объекта модели @model List, а затем, используя цикл или как вы хотите это сделать, создайте столько редакторов, сколько вам нужно для каждого объекта

то в вашем контроллере ваш принимающий параметр create также будет списком вашей модели.

person AwDogsGo2Heaven    schedule 30.04.2012
comment
спасибо за ответ, но есть ли какая-либо документация или онлайн-пример того, как я могу это сделать? BR - person john Gu; 01.05.2012