我只是拿起.net MVC而且我遇到了一些我无法解决的问题。我显然错过了一些基本原则,但希望得到一些帮助。
我有一个带有两个IEnumerables的ViewModel,我想用它来创建dropdownlistfors。我的GET工作正常,列表按预期填充。
现在我将ViewModel发布回POST方法,不做任何有用的事情,只是为了尝试理解mvc的工作原理。我希望我能够简单地从回发的模型重新填充dropdownlistfors - 但我得到一个空引用异常。
ViewModel中的其他值(例如partyid)在POST中存活,所以我很困惑。
如果我重新填充列表,我可以让它工作,但这似乎是错误的。
有人可以给我一个指针吗?
我的ViewModel
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>
}
错误
答案 0 :(得分:2)
在MVC中,视图上的模型会加载到控制器操作中,它们不会与后期操作一起发回。
如果您习惯ASPX
的视图状态,MVC中没有这样的东西,您需要为当前操作中的每个视图加载所需的内容。
答案 1 :(得分:0)
下拉列表将呈现为html作为标记,并以纯单值返回到服务器。
你必须在服务器上重新绑定/重新填充它们,在验证这样的场景中很烦人,同样的模型应该返回给客户端。
框架中没有对此的支持 - 您必须自己完成。
还有一件事 - 如果您必须返回列表项并希望它们返回服务器,您可以序列化tham并隐藏在某个隐藏字段中。但它是丑陋和不安全的,因为任何人都可以改变它的价值。