简体   繁体   English

如何使用 ASP.NET MVC 中的下拉列表更新 object 的属性?

[英]How update a property of an object using a drop-down list in ASP.NET MVC?

I am trying to update a property of an object called Moeda using a drop down list and a save button.我正在尝试使用下拉列表和保存按钮更新名为Moeda的 object 的属性。 But when a press the submit button, the url changes but I'm no getting back to the Index page and nothing is happing to the data但是当按下提交按钮时,url 发生了变化,但我没有回到索引页面,数据也没有任何变化

This is my model class:这是我的 model 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; }
}

And these are my controller methods:这些是我的 controller 方法:

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));
}

And this is my view:这是我的观点:

@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>

What am I doing wrong?我究竟做错了什么?

you have to add asp-for to select and @Html.AntiForgeryToken() to form您必须将 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>
.....

}

and fix the actions并修复动作

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));
}

Update your list first with the newly added item in the Add(..) method then update list in the model and finally return view with updated model.首先使用 Add(..) 方法中新添加的项目更新您的列表,然后更新 model 中的列表,最后使用更新的 model 返回视图。 If you have correctly mapped your list from backed to the view drop down list then this should be working.如果您已正确地将列表从支持映射到视图下拉列表,那么这应该可以工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM