c#mvc从视图中检索数据

时间:2016-05-30 19:43:02

标签: c# asp.net-mvc

我想从视图中检索数据,它应该像这样工作:

  1. 用户填写网页上提供的表格
  2. 用户点击“搜索”按钮
  3. 某些功能收集数据并在另一个视图中显示
  4. 我尝试了所有关于其他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);
     }
    

3 个答案:

答案 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方法。这就是它。

祝你好运。