Я просто собираю.net MVC, и я сталкивался с чем-то, что я не могу решить. Я, очевидно, пропустил какой-то базовый принцип, но хотел бы помочь.
У меня есть ViewModel с двумя IEnumerables, которые я хочу использовать для создания dropdownlistfors. Мой GET работает нормально, списки заполняются, как ожидалось.
Теперь я отправляю ViewModel обратно в метод POST, но ничего не полезен, но просто попытаюсь понять, как работает mvc. Я ожидал, что я просто смогу повторно заполнить dropdownlistfors из модели, которая была отправлена обратно, но я получаю исключение с нулевой ссылкой.
Другие ценности, такие как partyid, в ViewModel выходят за POST, поэтому я запутался.
Я могу заставить его работать, если я перепишу списки, но это кажется неправильным.
Может кто-нибудь дать мне указатель?
Моя модель просмотра
public class DemoViewModel
{
//properties
public IEnumerable<tbl_server_lookup> servers { get; set; }
public int serverId { get; set; }
public IEnumerable<tbl_site_lookup> sites { get; set; }
public int siteId { get; set; }
public int partyid { get; set; }
public string message { get; set; }
public DemoViewModel()
{
}
}
Мой контроллер
// GET: /Demos/Test/
[HttpGet]
public ActionResult Test()
{
DemoViewModel demo = new DemoViewModel();
using (var dbContext = new ADAPI.Models.db_ad_apiEntities2())
{
var serverList = dbContext.tbl_server_lookup.Where(s => s.server_name != null);
demo.servers = serverList.ToList();
var siteList = dbContext.tbl_site_lookup.Where(w => w.site_name != null);
demo.sites = siteList.ToList();
}
demo.message = "Enter the user id you would like to look up in the box below.";
return View(demo);
}
//
//POST: /Demos/Test/
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Test(DemoViewModel demo)
{
//It works if I uncomment this block...
/*using (var dbContext = new ADAPI.Models.db_ad_apiEntities2())
{
var myQuery = dbContext.tbl_server_lookup.Where(s => s.server_name != null);
demo.servers = myQuery.ToList();
var siteList = dbContext.tbl_site_lookup.Where(w => w.site_name != null);
demo.sites = siteList.ToList();
}*/
demo.message = "the user id you posted is: " + demo.partyid + ". The Server you selected is: ";// +demo.serverId;
return View(demo);
}
Мой взгляд
@model ADAPI.ViewModels.DemoViewModel
<h2>Demos</h2>
<h3>@Model.message</h3>
@using (Html.BeginForm("Test","Demos"))
{
@Html.AntiForgeryToken()
<div class="">
<h4>Party ID</h4>
@Html.ValidationSummary(true)
<!-- input box for party id-->
@Html.TextBoxFor(model => model.partyid)
<!-- dropdown list of server types eg live vs test-->
@Html.DropDownListFor(model => model.serverId, new SelectList(Model.servers, "server_Id","server_name"))
@Html.DropDownListFor(model => model.siteId, new SelectList(Model.sites, "site_short_name","site_name"))
<input type="submit" value="Try" />
</div>
}
Ошибка
В MVC модель на представлениях загружается в действие контроллера, они не отправляются обратно вместе с действием post.
Если вы привыкли к представлению в ASPX
, в MVC нет такой вещи, вам нужно загрузить то, что вам нужно для каждого представления в текущем действии.
Выпадающие списки отображаются в html как тег и возвращаются на сервер в виде простого одиночного значения.
Вы должны переподключить/перезаписать их на сервере, что раздражает в таких сценариях, как проверка, когда та же модель должна быть возвращена клиенту.
В рамках этой поддержки нет поддержки - вы должны делать это самостоятельно.
Еще одна вещь: если вам абсолютно необходимо вернуть элементы списка и вернуть их обратно на сервер, вы можете сериализовать tham и спрятать в каком-то скрытом поле. Но это уродливое и небезопасное, так как любой может изменить свою ценность.
[HttpPost] Test()
вы должны перезагрузить элементы списка.