#c# #asp.net-mvc #drop-down-menu
#c# #asp.net-mvc #выпадающее меню
Вопрос:
Я получаю значения из ViewModel в представление для полей формы. В одном из моих выпадающих списков значения верны, но в другом значение повторяется вместо изменения. Что я делаю не так?
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);
}
Теперь это мой контроллер. Теперь мое представление просто выдает ошибку. Я думаю, что я что-то упускаю или что-то недопонимаю.
Комментарии:
1. Вы говорите, что параметры в обоих
@Html.DropDownListFor(model => model.ServiceList
и@Html.DropDownListFor(model => model.CarrierList
одинаковы?2. Нет. Значения в @Html.DropDownListFor(модель => модель. Список носителей работает нормально. Значения: UPS, FedEx. В @Html.DropDownListFor(модель => модель. ServiceList значения UPS GRND, UPS GRND, UPS GRND, UPS GRND. Операторы заполняются нормально, а службы — нет.
3. Хорошо! Проверьте мой ответ. Это должно решить вашу проблему.
Ответ №1:
DropDownListFor(model => model.ServiceList
Предполагается, что этот метод работает не так, и я подозреваю, что это ответ на вашу проблему.
Предполагается, что это лямбда-выражение должно предоставлять поле, в котором будет содержаться значение, которое выводит этот выпадающий список. Для вашего случая у вас должно быть два поля в модели:
public class ViewModel
...
public int CarrierId { get; set; }
public string CarrierServiceCode { get; set; }
Они будут содержать текущее выбранное значение, если ничего не выбрано (пока). И они должны использоваться в этом лямбда:
DropDownListFor(model => model.CarrierServiceCode
В качестве альтернативы вы можете использовать DropDownList()
метод, для которого не требуется поле в модели, и присвоить ему пользовательское имя, которое будет опубликовано с выбранным значением.
Ответ №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. Я отредактировал свой пост, чтобы показать фактическую модель, которая используется в ViewModel. Как это вписывается в ваше решение?
2. @SGekko Где ваш метод индексной записи?
3. Показано выше в контроллере.
4. @SGekko Почему запутался? Скажите мне, пожалуйста?
5. Я внес изменения в свой пост, отображающий новый код контроллера, но все еще не работает. Чего я не понимаю? Теперь в представлении отображается ошибка сервера в приложении ‘/’.