如何使用 ASP.NET MVC 中的下拉列表更新对象的 属性?
How update a property of an object using a drop-down list in ASP.NET MVC?
我正在尝试使用下拉列表和保存按钮更新名为 Moeda
的对象的 属性。但是当按下提交按钮时,url 发生了变化,但我没有返回到索引页面并且数据没有任何变化
这是我的模型class:
public class Moeda
{
[Key]
public int Id { get; set; }
[Display(Name = "Tipo de Moeda")]
public string Tipo { get; set; }
public int Quantidade { get; set; }
[DisplayFormat(DataFormatString = "R$ {0:0.00}")]
public float Valor { get; set; }
}
这些是我的控制器方法:
public IActionResult Add()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Add(String tipo, int quantidade)
{
var moeda = await _context.Moeda
.FirstOrDefaultAsync(m => m.Tipo == tipo);
moeda.Quantidade += quantidade;
_context.Update(moeda);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
这是我的观点:
@model MaquinaDeTrocoMVC.Models.Moeda
<!DOCTYPE html>
<html>
<body>
<h1>The select element</h1>
<form action="/moedas/add">
<label for="tipo">Escolha uma moeda</label>
<select name="tipo" id="tipo">
<option value="1 Centavo">1 Centavo</option>
<option value="5 Centavos">5 Centavos</option>
<option value="10 Centavos">10 Centavos</option>
<option value="25 Centavos">25 Centavos</option>
<option value="50 Centavos">50 Centavos</option>
<option value="1 Real">1 Real</option>
</select>
<div class="form-group">
<label asp-for="Quantidade" class="control-label"></label>
<input asp-for="Quantidade" class="form-control" />
<span asp-validation-for="Quantidade" class="text-danger"></span>
</div>
<br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
我做错了什么?
你必须添加 asp-for 到 select 和 @Html.AntiForgeryToken() 以形成
@{
var items = new List<SelectListItem>
{
new SelectListItem { Value="1 Centavo", Text="1 Centavo" },
new SelectListItem { Value="5 Centavos", Text="5 Centavos" },
new SelectListItem { Value="10 Centavos", Text="10 Centavos" },
new SelectListItem { Value="25 Centavos", Text="25 Centavos" },
new SelectListItem { Value="50 Centavos", Text="50 Centavos" },
new SelectListItem { Value="1 Real", Text="1 Real" }
};
}
@using (Html.BeginForm("add", "moedas", FormMethod.Post))
{
@Html.AntiForgeryToken()
....
<select asp-for="Tipo" asp-items="@items" id="tipo"> select </select>
.....
}
并修正动作
public IActionResult Add()
{
var model= new Moeda();
return View(model);
}
public async Task<IActionResult> Add(Moeda moeda)
{
_context.Moeda.Add(moeda);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
首先使用 Add(..) 方法中新添加的项目更新您的列表,然后更新模型中的列表,最后 return 使用更新后的模型查看。如果您已正确地将列表从支持的列表映射到视图下拉列表,那么这应该有效。
我正在尝试使用下拉列表和保存按钮更新名为 Moeda
的对象的 属性。但是当按下提交按钮时,url 发生了变化,但我没有返回到索引页面并且数据没有任何变化
这是我的模型class:
public class Moeda
{
[Key]
public int Id { get; set; }
[Display(Name = "Tipo de Moeda")]
public string Tipo { get; set; }
public int Quantidade { get; set; }
[DisplayFormat(DataFormatString = "R$ {0:0.00}")]
public float Valor { get; set; }
}
这些是我的控制器方法:
public IActionResult Add()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Add(String tipo, int quantidade)
{
var moeda = await _context.Moeda
.FirstOrDefaultAsync(m => m.Tipo == tipo);
moeda.Quantidade += quantidade;
_context.Update(moeda);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
这是我的观点:
@model MaquinaDeTrocoMVC.Models.Moeda
<!DOCTYPE html>
<html>
<body>
<h1>The select element</h1>
<form action="/moedas/add">
<label for="tipo">Escolha uma moeda</label>
<select name="tipo" id="tipo">
<option value="1 Centavo">1 Centavo</option>
<option value="5 Centavos">5 Centavos</option>
<option value="10 Centavos">10 Centavos</option>
<option value="25 Centavos">25 Centavos</option>
<option value="50 Centavos">50 Centavos</option>
<option value="1 Real">1 Real</option>
</select>
<div class="form-group">
<label asp-for="Quantidade" class="control-label"></label>
<input asp-for="Quantidade" class="form-control" />
<span asp-validation-for="Quantidade" class="text-danger"></span>
</div>
<br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
我做错了什么?
你必须添加 asp-for 到 select 和 @Html.AntiForgeryToken() 以形成
@{
var items = new List<SelectListItem>
{
new SelectListItem { Value="1 Centavo", Text="1 Centavo" },
new SelectListItem { Value="5 Centavos", Text="5 Centavos" },
new SelectListItem { Value="10 Centavos", Text="10 Centavos" },
new SelectListItem { Value="25 Centavos", Text="25 Centavos" },
new SelectListItem { Value="50 Centavos", Text="50 Centavos" },
new SelectListItem { Value="1 Real", Text="1 Real" }
};
}
@using (Html.BeginForm("add", "moedas", FormMethod.Post))
{
@Html.AntiForgeryToken()
....
<select asp-for="Tipo" asp-items="@items" id="tipo"> select </select>
.....
}
并修正动作
public IActionResult Add()
{
var model= new Moeda();
return View(model);
}
public async Task<IActionResult> Add(Moeda moeda)
{
_context.Moeda.Add(moeda);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
首先使用 Add(..) 方法中新添加的项目更新您的列表,然后更新模型中的列表,最后 return 使用更新后的模型查看。如果您已正确地将列表从支持的列表映射到视图下拉列表,那么这应该有效。