Я получаю значения из ViewModel в представление для полей формы. В одном из моих DropDownList значения верны, но в другом значение повторяется вместо изменения. Что я делаю не так?

ViewModel:

namespace FulfillmentPortal.ViewModels
{
public class ViewModel
{
    [Required(ErrorMessage = "Please select a carrier")]
    public List<Carrier> CarrierList { get; set; }

    [Required(ErrorMessage = "Please select a service")]
    public List<CarrierService> ServiceList { get; set; }
}
}

Контроллер:

public class FulfillmentController : Controller
{
    private CarrierModel db = new CarrierModel();

    // GET: Fulfillment
    public ActionResult Index()
    {
        ViewModel vm = new ViewModel
        {
            CarrierList = db.Carriers.ToList(),
            ServiceList = db.CarrierServices.ToList()
        };
        return View(vm);
    }
}

Посмотреть:

@model FulfillmentPortal.ViewModels.ViewModel

@{
    ViewBag.Title = "index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="panel panel-primary">
<div class="panel-heading">REPORT OPTIONS</div>
<div class="panel-body" style="padding-left:35px;">
    <form id="processForm" class="form-horizontal" action="~/Fulfillment/Report" method="post" enctype="multipart/form-data">
        <div class="form-group">
            <label for="sel1">Carrier:</label>
            @Html.DropDownListFor(model => model.CarrierList, new SelectList(Model.CarrierList, "CarrierId", "CarrierName"), "Select a Carrier",
                new { @class = "form-control", @style = "width:auto; margin-bottom:15px;" })
            <label for="sel2">Carrier Services:</label>
            @Html.DropDownListFor(model => model.ServiceList, new SelectList(Model.ServiceList, "Code", "WebName"), "Select a Service", 
                new { @class = "form-control", @style = "width:auto; margin-bottom:15px;" })           
        </div>
    </form>
</div>
</div>

Модель:

public partial class CarrierModel : DbContext
    {
        public CarrierModel()
            : base("name=CarrierModel")
        {
        }

        public virtual DbSet<Carrier> Carriers { get; set; }

        public virtual DbSet<CarrierService> CarrierServices { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }    
 [HttpPost]
  public ActionResult Index(ViewModel viewModel)
  {
     if (ModelState.IsValid)
     {
         viewModel.CarrierList.ToList();
         viewModel.ServiceList.ToList();
     }

       return View(viewModel);
}

Это мой контроллер сейчас. Теперь мое мнение просто ошибочно. Я думаю, что я что-то упускаю или что-то неправильно понимаю. Пожалуйста, помогите мне понять, чего мне не хватает.

Любая помощь будет отличной. Благодарность!

0
SGekko 18 Апр 2019 в 17:23

2 ответа

Лучший ответ

Ваш ViewModel должен быть следующим:

public class ViewModel
{
    [Required(ErrorMessage = "Please select a carrier")]
    public int CarrierId {get; set;}

    [Required(ErrorMessage = "Please select a service")]
    public int ServiceCode {get; set;}


    public List<Carrier> CarrierList { get; set; }
    public List<CarrierService> ServiceList { get; set; }
}

Тогда в представлении:

<label for="sel1">Carrier:</label>
@Html.DropDownListFor(model => model.CarrierId, new SelectList(Model.CarrierList, "CarrierId", "CarrierName"), "Select a Carrier",
                new { @class = "form-control", @style = "width:auto; margin-bottom:15px;" })
<label for="sel2">Carrier Services:</label>
@Html.DropDownListFor(model => model.ServiceCode, new SelectList(Model.ServiceList, "Code", "WebName"), "Select a Service", 
                new { @class = "form-control", @style = "width:auto; margin-bottom:15px;" })

Тогда ваш метод Index Post должен быть следующим:

[HttpPost]
public ActionResult Index(ViewModel viewModel)
{
    if(ModelState.IsValid)
    {
       // do whatever you want with `viewModel.CarrierId` and `viewModel.ServiceCode` here
    }

    viewModel.CarrierList = db.Carriers.ToList();
    viewModel.ServiceList = db.CarrierServices.ToList();
    return View(viewModel);
}
1
TanvirArjel 18 Апр 2019 в 15:44
DropDownListFor(model => model.ServiceList

Это не то, как этот метод должен работать, и я подозреваю, что это ответ на вашу проблему.

Предполагается, что эта лямбда содержит поле, которое будет содержать значение, которое выводит этот выпадающий список. Для вашего случая у вас должно быть два поля в модели:

public class ViewModel
...
    public int CarrierId { get; set; }
    public string CarrierServiceCode { get; set; }

Они будут содержать текущее выбранное значение, ни на одном, если ничего не выбрано (пока). И они должны быть использованы в этой лямбде:

DropDownListFor(model => model.CarrierServiceCode

В качестве альтернативы вы можете использовать метод DropDownList(), который не требует поля в модели, и дать ему произвольное имя, которое будет опубликовано с выбранным значением.

2
Andrei 18 Апр 2019 в 14:39