如何获得强类型DropDownList以绑定到控件Action

时间:2014-02-11 13:11:40

标签: asp.net-mvc asp.net-mvc-4 html.dropdownlistfor

我刚刚开始了一个新的MVC项目,但我无法从表单中获取发布结果。

这是我的模型类:

public class User
{
    public int id { get; set; }

    public string name { get; set; } 
}

public class TestModel
{
    public List<User> users { get; set; }
    public User user { get; set; }
    public SelectList listSelection { get; set; }

    public TestModel()
    {
        users = new List<User>()
        {
            new User() {id = 0, name = "Steven"},
            new User() {id = 1, name = "Ian"},
            new User() {id = 2, name = "Rich"}
        };

        listSelection = new SelectList(users, "name", "name");
    }
}

这是我的观点类

@model MvcTestApplicaiton.Models.TestModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.user, @Model.listSelection)

    <p>
        <input type="submit" value="Submit" />
    </p>
}

@if (@Model.user != null)
{
    <p>@Model.user.name</p>
}

这是我的控制者:

public class TestModelController : Controller
{
    public TestModel model;
    //
    // GET: /TestModel/

    public ActionResult Index()
    {
        if(model ==null)
            model = new TestModel();

        return View(model);
    }

    [HttpPost]
    public ActionResult Test(TestModel test)
    {
        model.user = test.user;

        return RedirectToAction("index", "TestModel");
    }

}

下拉列表看起来很好但我看不到让ActionResult Test函数运行。我认为它只会与反射结合,但无论出现什么问题,我都看不到它。

2 个答案:

答案 0 :(得分:0)

看起来你正在回复索引。使用GET Test()操作方法,或在BeginForm()中指定ACTION参数。

例如,

@using (Html.BeginForm("Test", "TestModel"))
{
    @Html.DropDownListFor(x => x.user, @Model.listSelection)

    <p>
        <input type="submit" value="Submit" />
    </p>
}

或者使用名为Test的视图(将index.cshtml重命名为test.cshtml):

public ActionResult Test()
{
    if(model ==null)
        model = new TestModel();

    return View(model);
}

答案 1 :(得分:0)

您的代码中有两个主要错误。

  1. 正如Brett所说,你发布的是Index方法,但是你没有支持POST动词的Index方法。最简单的修复方法是使用Html.BeginForm(“Test”,“TestModel”)更改Html.BeginForm()
  2. 你以错误的方式使用Html.DropDownListFor。您只能在那里传递值类型,因为不要忘记View将生成HTML页面。因此,在您的模型中,您应该拥有UserID,而在View中,您应该拥有@ Html.DropDownListFor(x =&gt; x.UserID,@ Model.listSelection)。最后,在您的Action中,您应查询数据源以获取具有此ID的用户的详细信息。
  3. 希望这有帮助。