Как я могу безопасно получить доступ к ключевым группам в FormCollection? - PullRequest
0 голосов
/ 10 октября 2011

У меня есть table, где каждый tr сгруппирован, для их input элементов name установлено значение, уникальное для каждой строки.

Например,

    <td>
        <input data-field="opps" type="text" value="somevalue" name="@item.Code" />
    </td>
    <td>
        <input data-field="asc" type="text" value="somevalue2" name="@item.Code" />
    </td>

По почте

[HttpPost]
        public ActionResult Update(FormCollection collection)
        {
            try
            {
                //doin work on collection...order assumed static

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

my System.Web.MVC.FormCollection сгруппированы в том же порядке, в котором я определяю <td>. Я не люблю принимать заказ, но без доступа к моему data-field я не уверен, что еще я могу сделать (возможно, я мог бы добавить значение поля данных в качестве префикса к name и поместить все это вместе с пользовательской коллекцией и Regex .. но это кажется сумасшедшим).

Есть ли способ доступа к data-field? Таким образом, я не хрупок для переупорядочения или добавления новых столбцов в представлении.

1 Ответ

1 голос
/ 10 октября 2011

Допустим, у вас есть класс (модель), определенный следующим образом:

public class MyModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

В вашем контроллере у вас может быть действие под названием Create, например:

[HttpGet]
public ViewResult Create()
{
    MyModel sampleModel = new MyModel();
    return View(sampleModel);
}

[HttpPost]
public ActionResult Create(MyModel sampleModel)
{
    if (ModelState.IsValid)
    {
        TempData["Error"] = "There were errors. Please correct the problem and submit again";
        return View(sampleModel);
    }

    // At this point everything is fine and you can access data in your sampleModel
    if (sampleModel.Age >= 16)
    {
        return RedirectToAction("LegalAccess");
    }
    else
    {
        TempData["Error"] = "You must be 16 or over to access this site";      
        return RedirectToAction("AgeRestriction");
    }
}

Когда вы создаете строго типизированное представление, которое использует MyModel в качестве модели, вы можете определить его примерно так:

@model MyModel

@{
    Layout = "~/Shared/_Layout.cshtml";
}

@using (Html.BeginForm()) 
{
    @Html.LabelFor(m => m.FirstName)
    @Html.TextBoxFor(m => m.FirstName)
    <br />
    @Html.LabelFor(m => m.LastName)
    @Html.TextBoxFor(m => m.LastName)
    <br />
    @Html.LabelFor(m => m.LastName)
    @Html.TextBoxFor(m => m.LastName)

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

Когда вы отправляете эту форму, связыватель модели в фоновом режиме копирует данные из этой формы, используя Request.Form, в объект типа MyModel, который он создает в фоновом режиме. Этот новый объект передается действию, которое обрабатывает метод HTTP POST. При этом вы получаете строго типизированный объект и вам не нужно беспокоиться о порядке элементов в FormCollection.

Надеюсь, я помог ответить на ваш вопрос.

КСТАТИ. Я написал это без Visual Studio, поэтому я надеюсь, что нет ошибок. : -)

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