在ASP.NET MVC中使用POST传递变量

时间:2011-10-21 23:17:16

标签: c# asp.net-mvc http-post

我正在尝试在asp.net MVC中传递一个字符串变量。我使用断点,所以我看到它确实转到控制器中的正确方法,但发布的变量等于null。

我的标记:

@{
    ViewBag.Title = "TestForm";
}

<h2>TestForm</h2>

@using (Html.BeginForm()) {
   <input type="text" id="testinput" />

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

我的控制器:

public ActionResult TestForm()
{
    return View();
} 

[HttpPost]
public ActionResult TestForm(string testinput)
{
    Response.Write("[" + testinput + "]");

    return View();
}

我将断点放在第二个TestForm方法中,testinput为null .... 我错过了什么吗?

注意:我意识到大部分时间我都会使用模型传递数据,但我想知道我也可以传递字符串。

作为同一问题的一部分,我如何传递几个变量?我的控制器中的方法是这样的:

[HttpPost]
public ActionResult TestForm(string var1, var2)
{
}

2 个答案:

答案 0 :(得分:19)

对我来说,看起来你设置的id不是名字。我每天都使用MVC3,所以我不会重现你的样本。 (我醒了20个小时编程;)但仍然有动力去帮助)请告诉我它是否不起作用。但对我来说,看起来你必须设置“name”属性...而不是id属性。试试......如果它不起作用,我现在正在等待帮助你。

     <input type="text" id="testinput" name="testinput" />

答案 1 :(得分:1)

在一个稍微单独的注释上,传递变量就像你一样没有错,但更有效的方法是传递一个强类型的视图模型,让你可以利用MVC的优点的许多方面:

  • 强类型观点
  • MVC模型绑定
  • Html Helpers

创建新的视图模型:

public class TestModel
{
    public string TestInput { get; set; }
}

您的测试控制器:

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

    [HttpPost]
    public ActionResult TestForm(FormCollection collection)
    {
        var model = new TestModel();
        TryUpdateModel(model, collection);

        Response.Write("[" + model.TestInput + "]");

        return View();
    }

您的观点:

@model <yourproject>.Models.TestModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>TestForm</title>
</head>
<body>
    <div>
        @using(Html.BeginForm())
        {
            <div class="editor-label">
                @Html.LabelFor(m => m.TestInput)
            </div>
            <div class="editor-label">
                @Html.TextBoxFor(m => m.TestInput)
            </div>
            <input type="submit" value="Test Form"/>
        }
    </div>
</body>
</html>