MVC核心选择标签未更新字段值

时间:2019-02-13 12:57:27

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我有一个带有下拉菜单的应用程序,我希望从下拉菜单中选择的值来更新我的模型,但是由于某种原因,它不会。路由到IActionResult方法时,我总是得到空值。

型号:

public class MyModel
{
    public string Name{ get; set; }
    public List<SelectListItem> MyNames { get; set; }
}

查看:

    <label asp-for="Name" class="control-label col-md-3"></label>
        <div class="col-sm-9">
            <select asp-for="Name" asp-items="Model.MyNames" class="form-control"></select>
        </div>
        <span asp-validation-for="Name" class="text-danger"></span>

    <span class="text-right">
                    <a class="btn btn-info btn-lg btn-block" type="submit"
                       asp-action="LoadData"
                       asp-controller="MyController" ,
                       asp-route-Name="@Name">Load Person</a>
                </span>

控制器:

public IActionResult Create()
    {
        var names = GetNamesFromFile(fileName);

        var myModel = new MyModel();

        foreach (var name in names)
        {
            myModel.MyNames.Add(new SelectListItem() { Value = name, Text = name});
        }
        return View(myModel);
    }

public IActionResult LoadData(string Name)
    {
       var person = GetPersonByName(Name); 

        return RedirectToAction(nameof(Index), "MyController", new { id = template.PersonId });
    }

当我路由回到我的ActionResult时,我希望Name参数具有在下拉菜单中设置的值。该代码对我来说似乎很好,我不知道为什么它不起作用。

编辑:显然,问题出在“提交”按钮上。如果我使用href标签,则将不会提交表单,也不会调用下拉列表。有没有办法使此工作成为href标签?

1 个答案:

答案 0 :(得分:1)

听起来像您在犯两个错误:

1)根据MDN documentation<a>标签的type属性用于指定链接到URL的资源的媒体的MIME类型。它从不打算使用包含<select>元素的表单元素来执行提交。因此,Name属性值在重定向到LoadData操作时永远不会更改。

2)该页面未指定用于提交<form>元素中所选值的任何<select>元素/标签助手。提交表单是将其值发送回控制器操作方法的必要条件。

固定页面标记应如下所示:

<form asp-controller="MyController" asp-action="LoadData" method="get">
    <label asp-for="Name" class="control-label col-md-3"></label>
        <div class="col-sm-9">
            <select asp-for="Name" asp-items="Model.MyNames" class="form-control"></select>
        </div>
        <span asp-validation-for="Name" class="text-danger"></span>

    <span class="text-right">
        <button class="btn btn-info btn-lg btn-block" type="submit">Load Person</button>
    </span>
</form>

通过使用上述设置,Name参数应包含来自<select>元素的更新值,因为表单内容将作为查询字符串发送。