Используя .net MVC, почему мои списки не переживают пост?

1

Я просто собираю.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>
}

Ошибка Изображение 174551

  • 2
    Потому что этот список не публикуется в почтовом звонке, что, кстати, совершенно нормально. В вашей функции [HttpPost] Test() вы должны перезагрузить элементы списка.
  • 1
    Просто чтобы расширить то, на что уже указывал Мартийн, вы не захотите отправлять на сервер то, что уже есть на сервере. Таким образом, только выбранный выпадающий элемент - это то, что должно быть отправлено на сервер.
Показать ещё 12 комментариев
Теги:
asp.net-mvc
http

2 ответа

2
Лучший ответ

В MVC модель на представлениях загружается в действие контроллера, они не отправляются обратно вместе с действием post.

Если вы привыкли к представлению в ASPX, в MVC нет такой вещи, вам нужно загрузить то, что вам нужно для каждого представления в текущем действии.

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

Выпадающие списки отображаются в html как тег и возвращаются на сервер в виде простого одиночного значения.

Вы должны переподключить/перезаписать их на сервере, что раздражает в таких сценариях, как проверка, когда та же модель должна быть возвращена клиенту.

В рамках этой поддержки нет поддержки - вы должны делать это самостоятельно.

Еще одна вещь: если вам абсолютно необходимо вернуть элементы списка и вернуть их обратно на сервер, вы можете сериализовать tham и спрятать в каком-то скрытом поле. Но это уродливое и небезопасное, так как любой может изменить свою ценность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню