У меня есть коллекция форм, доступная в методе действий, но как получить ее значение. Я пробовал как это
string value = collection[1];
но я не получаю значение. Как получить доступ к значению в методе действий.
У меня есть коллекция форм, доступная в методе действий, но как получить ее значение. Я пробовал как это
string value = collection[1];
но я не получаю значение. Как получить доступ к значению в методе действий.
Если у вас есть:
<input type="text" name="inputName" />
Вы можете использовать имя атрибута элемента, как показано ниже:
[HttpPost]
public ActionResult yourAction(FormCollection collection)
{
string value = Convert.ToString(collection["inputName"]);
...
return View();
}
Я думаю, вам следует попытаться избавиться от объекта formcollection, если вы в состоянии, в пользу строго типизированной viewmodel. здесь есть несколько примеров на SO, и я связал первый, который я искал:
передача FormCollection в контроллер через метод JQuery Post и получение данных обратно...
однако, если вы хотите связать себя в узлах:), то вот пример, повторяющий форму formcollection:
http://stack247.wordpress.com/2011/03/20/iterate-through-system-web-mvc-formcollection/
Что-то вроде (код не проверен) -
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddNewLink(FormCollection collection)
{
string url = collection[1].ToString();
}
Создайте представление, подобное этому
<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
}
Примечание. Выше написанный код не рекомендуется делать, его просто для демонстрации.
Попробуйте этот пример, надеюсь, что это поможет...
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
DisplayFormCollectionDataSTRONG >
@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>
Мой предпочтительный вариант - использовать 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);
}
Просмотрите свой 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 - это один из способов получения данных представления в контроллере.