簡體   English   中英

ASP.NET MVC Foreach 來自多個下拉列表

[英]ASP.NET MVC Foreach from multiple dropdownlist

我試圖從視圖 model 中的每個下拉列表中獲取一個值。 我正在使用 foreach ,但這似乎不起作用。 任何人都可以在這里幫助我嗎?

我在 controller 中做 foreach。 我正在為此使用實體框架和存儲庫方法。 任何幫助都是有幫助的。

Controller

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(int? id, AddSaidasServicoViewModel model, string command)
{
        if (ModelState.IsValid)
        {
            //TODO: adicionar Userhelper para ver quem cria a saida. Criar campo na tabela BD.  Ver apontamento Notepad
            if (command.Equals("submit1"))
            {
                await _saidaservicoRepository.AddSaidaServicoAsync(model);
                return RedirectToAction(nameof(Create));
            }
            else
            {
                foreach(var elementoId in model.Elementos )
                {
                    await _elementoRepository.UpdateElementoSaidaServicosAsync(model);
                }
            }

            return RedirectToAction(nameof(Index));
        }
        
        return View(model);
}

查看標記:

@model FireHouseGest.web.Models.AddSaidasServicoViewModel

@{
    ViewData["Title"] = "Create";
}

<h2>Criar</h2>

<h4>Saída Serviço</h4>
<hr />
    <div class="row">
        <div class="col-md-4">
            <form asp-action="Create">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    
    
                <div class="container">
    
                    <div class="row">
                        <div class="text-center">
                            <div class="col-md-3 text-center">
                                <div class="form-group">
                                    <label asp-for="ServicoId" class="control-label"></label>
                                    <select asp-for="ServicoId" asp-items="Model.Servicos" class="form-control"></select>
                                    <span asp-validation-for="ServicoId" class="text-danger"></span>
                                </div>
                            </div>
                            <div class="col-md-3 text-center">
                                <div class="form-group">
                                    <label asp-for="ViaturaId" class="control-label"></label>
                                    <select asp-for="ViaturaId" asp-items="Model.Viaturas" class="form-control"></select>
                                    <span asp-validation-for="ViaturaId" class="text-danger"></span>
                                </div>
                            </div>
    
                        </div>
                    </div>
                    <div class="form-group">
                        <input type="submit" name="command" value="submit1" class="btn btn-default" />
                    </div>
                </div>
                <div class="container">
                    <div class="row">
                        <div class="col-lg-2 text-center">
                            <div class="form-group">
                                <label asp-for="ElementoId" class="control-label"></label>
                                <select asp-for="ElementoId" asp-items="Model.Elementos" class="form-control"></select>
                                <span asp-validation-for="ElementoId" class="text-danger"></span>
                            </div>
                        </div>
                        <div class="col-lg-2 text-center">
                            <div class="form-group">
                                <label asp-for="ElementoId" class="control-label"></label>
                                <select asp-for="ElementoId" asp-items="Model.Elementos" class="form-control"></select>
                                <span asp-validation-for="ElementoId" class="text-danger"></span>
                            </div>
                        </div>
                        <div class="col-lg-2 text-center">
                            <div class="form-group">
                                <label asp-for="ElementoId" class="control-label"></label>
                                <select asp-for="ElementoId" asp-items="Model.Elementos" class="form-control"></select>
                                <span asp-validation-for="ElementoId" class="text-danger"></span>
                            </div>
                        </div>
                        <div class="col-lg-2 text-center">
                            <div class="form-group">
                                <label asp-for="ElementoId" class="control-label"></label>
                                <select asp-for="ElementoId" asp-items="Model.Elementos" class="form-control"></select>
                                <span asp-validation-for="ElementoId" class="text-danger"></span>
                            </div>
                        </div>
                        <div class="col-lg-2 text-center">
                            <div class="form-group">
                                <label asp-for="ElementoId" class="control-label"></label>
                                <select asp-for="ElementoId" asp-items="Model.Elementos" class="form-control"></select>
                                <span asp-validation-for="ElementoId" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <input type="submit" name="command" value="submit2" class="btn btn-default" />
                    </div>
                </div>          
                <div class="form-group">
                    <label asp-for="Adecorrer" class="control-label"></label>
                    <input asp-for="Adecorrer" class="form-control" />
                    <span asp-validation-for="Adecorrer" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="Inicio" class="control-label"></label>
                    <input asp-for="Inicio" class="form-control" />
                    <span asp-validation-for="Inicio" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="Fim" class="control-label"></label>
                    <input asp-for="Fim" class="form-control" />
                    <span asp-validation-for="Fim" class="text-danger"></span>
                </div>
    
            </form>
        </div>
    </div>

視圖模型

    namespace FireHouseGest.web.Models
{
    public class AddSaidasServicoViewModel
    {


        public int SaidaServicoId { get; set; }


        
        [Display(Name = "Elementos")]
        public int ElementoId { get; set; }
        public IEnumerable<SelectListItem> Elementos { get; set; }


        [Display(Name = "Viatura")]
        public int ViaturaId { get; set; }
        public IEnumerable<SelectListItem> Viaturas { get; set; }


        [Display(Name = "Serviço")]
        public int ServicoId { get; set; }
        public IEnumerable<SelectListItem> Servicos { get; set; }


        [Display(Name = "Estado")]
        public int Adecorrer { get; set; }


        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy hh:mm }", ApplyFormatInEditMode = false)]
        public DateTime Inicio { get { return DateTime.Now; } }


        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy hh:mm }", ApplyFormatInEditMode = false)]
        public DateTime? Fim { get; set; }


        public User user { get; set; }

        
    }
}

這就是我所擁有的。 接受建議。

在編碼之前,您需要了解以下內容:

1.Model Binding 通過匹配輸入的name來查找和綁定屬性。

2.如果你有多個同名的輸入,你需要設置一個List<T>類型的參數來接收所有的值。

3.Dropdownlist 獲取選中的選項不是文本),請確保該值的類型與匹配屬性的類型相同。 例如ElementoId是 int 類型,所以Elementos中每個 SelectListItem 的值應該是 int 或者可以轉換為 int):

var model = new AddSaidasServicoViewModel()
{
    Elementos = new List<SelectListItem>() {
                new SelectListItem() { Value = "1", Text = "Elementos1" },
                new SelectListItem() { Value = "2", Text = "Elementos2" },
                new SelectListItem() { Value = "3", Text = "Elementos3" }
                },
      //....
};

4.Dropdownlist選中的值會通過搜索asp-for="xxx"的同名來匹配屬性。 例如asp-for="ElementoId"將生成 html: id="ElementoId" name="ElementoId" ,因此此輸入值將匹配您模型中的屬性 ElementoId)

5.雖然你有兩個提交按鈕,但提交按鈕總是會提交所有輸入的值,它們的格式相同

如下更改您的代碼,您將在List<string> ElementoId中收到所有選定的 ElementoId 值:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(int? id, AddSaidasServicoViewModel model,
                                                    List<string> ElementoId, string command)
{
    if (ModelState.IsValid)
    {
        //TODO: adicionar Userhelper para ver quem cria a saida. Criar campo na tabela BD.  Ver apontamento Notepad
        if (command.Equals("submit1"))
        {
            //...
        }
        else
        {
            foreach (var elementoId in ElementoId)
            {
                //....
            }
        }

        return RedirectToAction(nameof(Index));
    }

    return View(model);
}

感謝瑞納的回答。 這就是我所做的。

public async Task UpdateElementosSaidasAsync(AddSaidasServicoViewModel model, List<string> Elementos)
    {
        int SaidaServicos = _context.SaidaServicos.Max(item => item.Id);
        var Saida = await _context.SaidaServicos.FindAsync(SaidaServicos);



        if (Elementos == null)
        {
            return;
        }

        else
        {
            foreach (var elementoId in Elementos)
            {

                var updateElementoSaida = _context.Elementos.Where(e => e.Id == Convert.ToInt32(elementoId)).FirstOrDefault();
                updateElementoSaida.saidaServico = Saida;
                await _context.SaveChangesAsync();

            }

        }

        return;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM