MVC3 - 用按钮理解POST

P.B*_*key 5 razor asp.net-mvc-3

如何在提交后获取表单数据?

<form target="_self" runat="server">
    <p>
    <select id="BLAHBLAH2">
        <option>2010</option>
        <option>2011</option>
        <option>2012</option>
        <option>2013</option>
    </select>
    <input type="submit" runat="server" value="Change Year" />
    </p>
</form>
Run Code Online (Sandbox Code Playgroud)

这击中了控制器的Index方法.但是,没有任何内容Request.Form.为什么?

其次,我可以使用

<input type="button"而不是type=submit?也就是说,不引入ajax via onclick.

最后,如何在控制器中提交不同的方法,例如Create

Dar*_*rov 7

尝试删除那些runat服务器标签.它们不应该在ASP.NET MVC中使用.您的选择也没有名称.如果输入元素没有名称,则不会提交任何内容.此外,您的选项标签必须具有值属性,指示如果选择此选项将向服务器发送的值:

<form action="/Home/Create" method="post">
    <p>
    <select id="BLAHBLAH2" name="BLAHBLAH2">
        <option value="2010">2010</option>
        <option value="2011">2011</option>
        <option value="2012">2012</option>
        <option value="2013">2013</option>
    </select>
    <input type="submit" value="Change Year" />
    </p>
</form>
Run Code Online (Sandbox Code Playgroud)

但是在ASP.NET MVC中生成表单的正确方法是使用HTML帮助程序.根据您使用的视图引擎,语法可能会有所不同.以下是Razor视图引擎的示例:

@model MyViewModel
@using (Html.BeginForm("Create", "Home")) 
{
    <p>
        @Html.DropDownListFor(x => x.SelectedYear, Model.Years)
        <input type="submit" value="Change Year" />
    </p>
}
Run Code Online (Sandbox Code Playgroud)

这里有一个给定视图模型的强类型视图:

public class MyViewModel
{
    public string SelectedYear { get; set; }

    public IEnumerable<SelectListItem> Years
    {
        get
        {
            return Enumerable
                .Range(2010, 4)
                .Select(x => new SelectListItem
                {
                    Value = x.ToString(),
                    Text = x.ToString()
                });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由一些将呈现此视图的控制器操作填充:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Create(MyViewModel model)
    {
        ... model.SelectedYear will contain the selected year
    }
}
Run Code Online (Sandbox Code Playgroud)