Принимать параметры или необработанные данные в контроллере? - PullRequest
2 голосов
/ 14 февраля 2012

Мне было интересно, будет ли возможно иметь аргумент "params" в функции контроллера или что-то подобное, что позволило бы мне обработать X записей в моей форме.

Например, у меня есть форма, которая содержит X элементов name, которые автоматически генерируются через jQuery. Примером этих элементов имени может быть следующий:

<input type="text" name="studentName1"></input>
<input type="text" name="studentName2"></input>
<input type="text" name="studentName3"></input>

Теперь каждый раз происходит разное количество имен учеников, поэтому для меня довольно сложно обрабатывать данные формы в моем контроллере. Я имел в виду что-то вроде следующих 2 примеров, но, конечно, они не будут работать в реальности.

[HttpPost]
public ActionResult PostStudentNames(params string[] studentNames)

Или:

[HttpPost]
public ActionResult PostStudentNames(string[] formValues)

Могу ли я достичь чего-то подобного?

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Я просто хочу присоединиться к другому подходу, который вы можете использовать для этого. Если это более удобно, вы можете связать модель напрямую с коллекциями примитивных или сложных типов. Вот 2 примера:

index.cshtml:

@using (Html.BeginForm("ListStrings", "Home"))
{
    <p>Bind a collection of strings:</p>

    <input type="text" name="[0]" value="The quick" /><br />
    <input type="text" name="[1]" value="brown fox" /><br />
    <input type="text" name="[2]" value="jumped over" /><br />
    <input type="text" name="[3]" value="the donkey" /><br />

    <input type="submit" value="List" />
}

@using (Html.BeginForm("ListComplexModel", "Home"))
{
    <p>Bind a collection of complex models:</p>

    <input type="text" name="[0].Id" value="1" /><br />
    <input type="text" name="[0].Name" value="Bob" /><br />
    <input type="text" name="[1].Id" value="2" /><br />
    <input type="text" name="[1].Name" value="Jane" /><br />

    <input type="submit" value="List" />
}

Student.cs:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

HomeController.cs:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult ListStrings(List<string> items)
    {
        return View(items);
    }

    public ActionResult ListComplexModel(List<Student> items)
    {
        return View(items);
    }
}

ListStrings.cshtml:

@foreach (var item in Model)
{
    <p>@item</p>
}

ListComplexModel.cshtml:

@foreach (var item in Model)
{
    <p>@item.Id. @item.Name</p>
}

Первая форма просто связывает список строк. Второе, связывает данные формы с List<Student>. Используя этот подход, вы можете позволить связующему с моделью по умолчанию выполнить утомительную работу за вас.

Обновлено для комментария

Да, вы тоже можете это сделать:

Форма:

@using (Html.BeginForm("ListComplexModel", "Home"))
{
    <p>Bind a collection of complex models:</p>

    <input type="text" name="[0].Id" value="1" /><br />
    <input type="text" name="[0].Name" value="Bob" /><br />
    <input type="text" name="[1].Id" value="2" /><br />
    <input type="text" name="[1].Name" value="Jane" /><br />
    <input type="text" name="ClassId" value="13" /><br />

    <input type="submit" value="List" />
}

Действие контроллера:

public ActionResult ListComplexModel(List<Student> items, int ClassId)
{
    // do stuff
}
3 голосов
/ 14 февраля 2012

Mathias,

Это прекрасно работает без обращения к объекту params.ваши элементы управления формой:

<input type="text" name="studentName" />
<input type="text" name="studentName" />
<input type="text" name="studentName" />
<input type="text" name="professorName" />

Вы бы использовали объект FormCollection, который будет содержать все элементы формы в виде разделенных запятыми списков (если это массив элементов управления) или как отдельные свойства.В приведенном выше примере это то, что мы получили бы:

[HttpPost]
public ActionResult PostStudentNames(FormCollection formValues)
{
    // basic check for rogue commas inside input controls
    // would need far more sophistication in a #real# app :)
    var valueStudents = formValues["studentName"].Split(',')
                          .Where(x => x.Length > 0).ToArray();
    var valueProfessor = formValues["professorName"];
    // other stuff
}

и т.д. ... По крайней мере, это мое воспоминание об этом из недавнего проекта.:)

1 голос
/ 14 февраля 2012
<input type="text" name="studentName[0]"></input>
<input type="text" name="studentName[1]"></input>
<input type="text" name="studentName[2]"></input>

public ActionResult PostStudentNames(string[] studentName)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...