我想从视图中检索数据,它应该像这样工作:
我尝试了所有关于其他stackoverflow问题的基本教程和技巧,但它仍然无效。我不知道我做错了什么......
这是我在视图中的代码:
section id="roomSearch">
<div class="banner">
<div class="banner-info">
<div class="container">
<div class="details-1">
@using (Html.BeginForm("UploadRoomSearchData", "HomeController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="col-md-10 dropdown-buttons">
<div class="col-md-3 dropdown-button">
@Html.AntiForgeryToken()
<div class="input-group">
@Html.TextBoxFor(m => m.YourName, new { @class = "form-control has-dark-background", @placeholder = "Imię" })
@Html.ValidationMessageFor(m => m.YourName, "", new { @class = "text-danger" })
<!--<input class="form-control has-dark-background"
name="slider-name" id="slider-name" placeholder="Imię" type="text" required="">-->
</div>
</div>
<!---strat-date-piker---->
<link rel="stylesheet" href="~/Content/jquery-ui.css" />
<script src="~/Scripts/jquery-ui.js"></script>
<script>
$(function () {
$("#datepicker,#datepicker1").datepicker();
});
</script>
<!---/End-date-piker---->
<div class="col-md-3 dropdown-button">
<div class="book_date">
<form>
<input class="date" id="datepicker" type="text" value="Przyjazd" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Przyjazd';}">
<!-- @Html.TextBoxFor(m => m.CheckIn, new { @class = "date" })
@Html.ValidationMessageFor(m => m.CheckIn, "", new { @class = "datefield" })-->
</form>
</div>
</div>
<div class="col-md-3 dropdown-button">
<div class="book_date">
<form>
<input class="date1" id="datepicker1" type="text" value="Wyjazd" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Wyjazd';}">
<!--@Html.TextBoxFor(m => m.CheckOut, new { @class = "date1" })
@Html.ValidationMessageFor(m => m.CheckOut, "", new { @class = "datefield" })-->
</form>
</div>
</div>
<div class="col-md-3 dropdown-button">
<div class="section_1">
<select id="country" onchange="change_country(this.value)" class="frm-field required">
<option value="null">Dwuosobowy</option>
<option value="null">Jednoosobowy</option>
<option value="AX">Apartament</option>
<option value="AX">Gościnny</option>
</select>
</div>
</div>
<div class="clearfix"> </div>
</div>
<div class="col-md-2 submit_button">
<form >
<input type="submit" value="SZUKAJ">
<!-- <p> @Html.ActionLink("SZUKAJ", "Book1", "Home")</p>-->
</form>
</div>}
这是我在控制器中的代码。现在我尝试只检索一个名字,看它是否有效。
[HttpPost]
public ActionResult UploadRoomSearchData(FormCollection form)
{
string name = Request["YourName"].ToString();
StringBuilder sbRoom = new StringBuilder();
sbRoom.Append("<b>Amount :</b> " + name + "<br/>");
//return RedirectToAction("Book1");
return Content(sbRoom.ToString());
}
我也试过这样的事情:
foreach(var v in form)
{
Write.Response("name:" + v);
}
答案 0 :(得分:0)
我尝试了你的代码,它似乎工作。 首先,我有控制器方法来显示表单
public ActionResult CreatePerson()
{
Person model = new Person();
return View(model);
}
然后是表格:
@model RetrieveDataFromaView.Models.Person
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Person</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.YourName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.YourName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.YourName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="submit" class="btn btn-default" />
</div>
</div>
</div>
}
哪个帖子到控制器方法
[HttpPost]
public ActionResult CreatePerson(FormCollection formCollection)
{
string name = Request["YourName"].ToString();
StringBuilder sbRoom = new StringBuilder();
sbRoom.Append("<b>Amount :</b> " + name + "<br/>");
return Content(sbRoom.ToString());
}
这将返回仅包含StringBuilder内容的视图。 也许您正在寻找RedirectToAction?
答案 1 :(得分:0)
你好,你在表格中有这一行:
@Html.AntiForgeryToken()
您可以将其删除或添加相应的属性以使用它:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreatePerson(FormCollection formCollection)
{
///Your code here
}
基本上,这是为服务器生成的令牌,以避免来自服务器未生成的表单的请求。
答案 2 :(得分:0)
您可以通过多种方式从ASP.NET MVC中的表单Post中检索数据。
通常,通过在Razor视图中指定Model类型来创建表单。您可以使用该类型来检索数据。 ASP.NET MVC将解析主体并为您填充参数中的对象。
例如:
<强>控制器:强>
public class HomeController: Controller
{
[HttpGet]
public ActionResult Index()
{
return View(new Person());
}
[HttpPost]
public ActionResult Index(Person p)
{
//Just for the sake of this example.
return Json(p);
}
}
Razor视图
@model WebApplication2.Models.Person
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<div>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div>
@Html.LabelFor(m => m.FirstName): <br/>
@Html.TextBoxFor(m => m.FirstName)
</div>
<div>
@Html.LabelFor(m => m.LastName): <br/>
@Html.TextBoxFor(m => m.LastName)
</div>
<input type="submit" value="Submit" />
}
</div>
</body>
</html>
FormsCollection
FormsCollection对象允许您访问表单的原始值。它充当Forms值的Dictionary
。这很有用,特别是当你有一个动态模型要解析时,或者你只是简单地不知道模型类型时。
使用它也非常简单。
[HttpPost]
public ActionResult Index(FormCollection form)
{
var dict = form.AllKeys.ToDictionary(key => key, key => form[key]);
return Json(dict);
}
PS:我看到你正在使用Request[key]
。它可能只是我,但这个看起来就像是黑暗魔法,你从哪里获取数据知道哪里(它使用查询字符串,cookie,请求体等等。似乎在某些情况下它可能真的有问题在未来。我更喜欢确切地知道数据的来源。但这可能只是我。
总之,如果您确切知道表格中应该包含什么,请使用模型方法。如果确实需要,请使用FormCollection
方法。这就是它。