我有一个带有下拉菜单的应用程序,我希望从下拉菜单中选择的值来更新我的模型,但是由于某种原因,它不会。路由到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标签?
答案 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>
元素的更新值,因为表单内容将作为查询字符串发送。