使用.net MVC为什么我的列表不能在帖子中存活?

时间:2014-12-05 10:46:25

标签: c# .net asp.net-mvc http

我只是拿起.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>
}

错误 The exception

2 个答案:

答案 0 :(得分:2)

在MVC中,视图上的模型会加载到控制器操作中,它们不会与后期操作一起发回

如果您习惯ASPX的视图状态,MVC中没有这样的东西,您需要为当前操作中的每个视图加载所需的内容。

答案 1 :(得分:0)

下拉列表将呈现为html作为标记,并以纯单值返回到服务器。

你必须在服务器上重新绑定/重新填充它们,在验证这样的场景中很烦人,同样的模型应该返回给客户端。

框架中没有对此的支持 - 您必须自己完成。

还有一件事 - 如果您必须返回列表项并希望它们返回服务器,您可以序列化tham并隐藏在某个隐藏字段中。但它是丑陋和不安全的,因为任何人都可以改变它的价值。