首页 > 解决方案 > 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 标签?

标签: c#asp.netasp.net-mvcasp.net-coreasp.net-core-mvc

解决方案


听起来你犯了两个错误:

1) 根据MDN 文档<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>元素的更新值,因为表单内容将作为查询字符串发送。


推荐阅读