在 asp.net 核心 mvc 中,如何从 select 列表中获取 post 上的 selected 项目,其中只有文本项目?

How do you get a selected item on post from a select list with only text item in asp.net core mvc?

如何从 asp.net 核心 mvc 中只有文本项的 select 列表中获取 selected 项值或 post 上的文本?

模型有一个字符串属性,ChosenText.

目前,ChosenText 在 post 操作方法中始终返回为 null。

标记:

<form asp-action="MakeChange" method="post" id="mainform">
  <select name="cars" id="cars" asp-for="ChosenText">
        <option value="volvo">Volvo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </select>
   <button type="submit">Submit</button>
</form>

操作方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult MakeChange(TestModel model)
    {
        if (model.ChosenText.ToUpper() == "VOLVO")
        {

        }

        return View(model);
    }

您必须将模型和@Html.AntiForgeryToken() 添加到视图中,并从 select 中删除 id 和 names 属性,因为您正在使用 asp-for 和表单提交

@model TestModel 

<form asp-action="MakeChange" method="post" >
@Html.AntiForgeryToken()

<select asp-for="ChosenText">
  .....
  
</form>

恕我直言,因为您使用的是模型,所以最好也创建一个模型

    [HttpGet]
     public IActionResult Get()
    {
      var model= new TestModel();
        return View("viewName", model);
    }

Currently, ChosenText always comes back in the post action method as null.

请注意,asp-for="ChosenText" 将帮助自动为渲染的 html <select> 标签生成 nameid 属性。

在您的代码中,我们可以发现您还为 Select Tag Helper 明确指定了 name="cars"id="cars"。为了使您发布的数据能够按预期绑定到模型 属性,请检查您的模型 class 和 属性 是否定义如下。

public class TestModel
{
    [BindProperty(Name = "cars")]
    public string ChosenText { get; set; }

    //...
    //other properties
    //...

此外,要解决类似问题,您可以使用发布的数据检查实际请求,并将发布的数据与您的模型属性进行比较。