Как получить доступ к моему formcollection в методе действий ASP.NET mvc?

У меня есть коллекция форм, доступная в методе действий, но как получить ее значение. Я пробовал как это

string value = collection[1];

но я не получаю значение. Как получить доступ к значению в методе действий.

Ответ 1

Если у вас есть:

<input type="text" name="inputName" />

Вы можете использовать имя атрибута элемента, как показано ниже:

[HttpPost]
public ActionResult yourAction(FormCollection collection)
{
     string value = Convert.ToString(collection["inputName"]);
     ...
     return View();
}    

Ответ 2

Я думаю, вам следует попытаться избавиться от объекта formcollection, если вы в состоянии, в пользу строго типизированной viewmodel. здесь есть несколько примеров на SO, и я связал первый, который я искал:

передача FormCollection в контроллер через метод JQuery Post и получение данных обратно...

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

http://stack247.wordpress.com/2011/03/20/iterate-through-system-web-mvc-formcollection/

Ответ 3

Что-то вроде (код не проверен) -

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddNewLink(FormCollection collection)
{
    string url = collection[1].ToString();
}

Ответ 4

Создайте представление, подобное этому

<form action="/myController/myAction" method="post">
User Name <input type="text" name="userName" /> <br>
Country <input type="text" name="country" /><br>
<input type="submit" value="submit" />
</form>

Создайте действие, как показано ниже

public ActionResult myAction(string userName, string country){
      //do some thing with userName
      //asp.net mvc3 has automatically bind that for you
}

Примечание. Выше написанный код не рекомендуется делать, его просто для демонстрации.

Ответ 5

Попробуйте этот пример, надеюсь, что это поможет...

 public class UserName
    {        
       public string FName { get; set; }
       public string LName{ get; set; }               
    }


        [HttpGet]
        public ActionResult FormCollectionEg()
        {
            return View();
        }

        [HttpPost]
        public ActionResult FormCollectionEg(FormCollection data)
        {
            UserName UserObj = new UserName();
            UserObj.FName = data["fname_name"];
            UserObj.LName = data["lname_name"];
            return  RedirectToAction("DisplayFormCollectionData", UserObj);           
        }


        public ActionResult DisplayFormCollectionData(UserName reg)
        {
             return View(reg);
        }

Создайте два вида - DisplayFormCollectionData FormCollectionEg

DisplayFormCollectionData​​STRONG >

@model YourProjectNamespace.Models.UserName

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>DisplayFormCollectionData</title>
</head>
<body>
    <div>
        <h4>User Deatails</h4>
        <hr />
        <dl class="dl-horizontal">
            <dt>
                @*@Html.DisplayNameFor(model => model.FName)*@
                First Name....
            </dt>

            <dd>
                @Html.DisplayFor(model => model.FName)
            </dd>

            <dt>
                @*@Html.DisplayNameFor(model => model.LName)*@
                Last Name...
            </dt>

            <dd>

                @Html.DisplayFor(model => model.LName)
            </dd>

        </dl>
    </div>
    <p>
        @*@Html.ActionLink("Edit", "Edit", new { /* id = Model.PrimaryKey */ }) |
        @Html.ActionLink("Back to List", "Index")*@
    </p>
</body>
</html>

FormCollectionEg -

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>FormCollectionEg</title>
</head>
<body>
    @using (Html.BeginForm("FormCollectionEg", "Home"))
    {
        <table>
            <tr>
                <td>Enter First Name</td>
                <td><input type="text" id="fname_id" name="fname_name" /></td>
            </tr>
            <tr>
                <td>Enter Last Name</td>
                <td><input type="text" id="lname_id" name="lname_name" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" /></td>
            </tr>
        </table>



    }

</body>
</html>

Ответ 6

Мой предпочтительный вариант - использовать UpdateModel.

Вместо ручного сопоставления полей этот метод MVC автоматически свяжет свойства из данных, доступных в запросе, так же, как если бы вы передали строгий тип в качестве параметра для действия.

[HttpPost]
public ActionResult FormCollectionEg()
{
    var model = new Username();

    UpdateModel<Username>(model);

    return View(model);
}

Вышеприведенный код будет включать данные из QueryString, а также данные формы, которые могут оказаться непригодными. Если вы использовали параметр в действии, вы должны ограничить это, используя [FromBody], но с UpdateModel вы все равно можете достичь того же, передав FormCollection в качестве поставщика значений.

[HttpPost]
public ActionResult FormCollectionEg(FormCollection collection)
{
    var model = new Username();

    UpdateModel<Username>(model, collection);

    return View(model);
}

Ответ 7

Просмотрите свой HTML файл (или используйте Inspect Element), чтобы увидеть атрибут name в поле ввода. Например, если у вас есть

<input type = "text" name = "YourName"/>

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

[HttpPost]
public ActionResult ActionName(FormCollection fc)     /*Using FormCollection*/
        {
                string variable_name = fc["YourName"];
                return View();
        }

FormCollection - это один из способов получения данных представления в контроллере.