为什么在我的DropDownListFor中发布一个空的异常?
我知道这听起来像网络上的其他问题,但实际上并非如此。 我试着找到正确的答案,以免浪费任何人的时间,但无济于事。 我还应该补充一点,我对MVC.NET来说很新。
我有一个DropDownListFor调用MVC 4视图,抛出一个空引用异常后。 我正在尝试测试没有选择任何选项的提交,即选择默认选择。 理想情况下,它会被拿起并用必要的现场消息向我吼叫。 我发现省份模型属性事实上在帖子上设置为-1,所以这很有用。
现在,这是我的问题偏离其他大多数人的地方。 我很确定该模型正在被正确传递,并且SelectList被填充。 我在视图中的行上设置了一个断点,并且在它发生爆炸之前在帖子中看到了它。 我的代码看起来像我见过的其他每个例子。
我非常感谢您提供的任何帮助。
最后,我会粘贴黄色屏幕信息。
所以这里是摘录,我把它的大部分删除了,所以你不会被不相关的代码淹没:
视图:
@using GymManagement.UI.Models
@model UserModel
@Html.DropDownListFor(m => m.Province, Model.ProvinceList, new {@id="ProvincePersonal", @class="inputField", @value="@Model.Province"})
控制器:
public ActionResult CreateMember()
{
return CreateUser();
}
[HttpPost]
public ActionResult CreateMember(UserModel model)
{
return CreateUser(model);
}
private ActionResult CreateUser()
{
var model = new UserModel();
PrepareModel(model, false);
return View(model);
}
private ActionResult CreateUser(UserModel model)
{
if (ModelState.IsValid)
{
return DisplayUser(model);
}
PrepareModel(model, true);
return View(model);
}
private void PrepareModel(UserModel model, bool isPostback)
{
// other items removed for brevity
if (Session["Provinces"] == null || ((List<Province>)Session["Provinces"]).Count == 0)
{
var serviceClient = ServiceProxy.GetLookupService();
var provinces = serviceClient.GetProvinces(); // Returns List<Province>
provinces = provinces.OrderBy(p => p.ProvinceName).ToList();
Session["Provinces"] = provinces;
model.Provinces = provinces;
}
else
{
model.Provinces = ((List<Province>)Session["Provinces"]);
}
}
模型:
// base model
public class BaseModel
{
public BaseModel()
{
Provinces = new List<Province>();
}
public List<Province> Provinces { get; set; }
}
// user model
public int Province { get; set; }
public IEnumerable<SelectListItem> ProvinceList
{
get
{
var list = new SelectList(Provinces, "ProvinceId", "ProvinceName");
var defaultItem = Enumerable.Repeat(new SelectListItem
{
Value = "-1",
Text = "Select province"
}, count: 1);
defaultItem = defaultItem.Concat(list);
if (Province != 0)
{
var selectedItem = Province.ToString();
var province = defaultItem.First(p => p.Value.Equals(selectedItem));
province.Selected = true;
}
return defaultItem;
}
}
你调用的对象是空的。
堆栈跟踪:
[C: Users Mike documents visual studio 2012 Projects GymManagement GymManagement.UI Views User CreateMember]中的ASP._Page_Views_user_CreateMember_cshtml.Execute()函数返回null [NullReferenceException:未将对象引用设置为对象的实例。 cshtml:46 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+279 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()+124 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)+180 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)+379 System.Web.Mvc。<> c__DisplayClass1a.b__17()+32 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func 1 continuation) +613 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList
1 filters,ActionResult actionResult)+263 System.Web.Mvc.Async。<> c__DisplayClass25.b__22(IAsyncResult asyncResult) +240 System.Web.Mvc。<> c__DisplayClass1d.b__18(IAsyncResult asyncResult)+28 System.Web.Mvc.Async。<> c__DisplayClass4.b__3(IAsyncResult ar)+15 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult )+ 53 System.Web.Mvc.Async。<> c__DisplayClass4.b__3(IAsyncResult ar)+15 System.Web.Mvc。<> c__DisplayClass8.b__3(IAsyncResult asyncResult)+42 System.Web.Mvc.Async。<> c__DisplayClass4 .b__3(IAsyncResult ar)+15 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+288
只有你可以通过调试你的代码来确定哪个对象是空的,因此抛出异常。 但真正的问题是,你已经完成了一个复杂的简单概念,并带有许多无意义的代码。 它可以简单地
查看模型
public Class UserViewModel
{
... // other properties of User
[Display(Name = "Province")]
[Required(ErrorMessage ="Please select a province")]
public int ProvinceID { get; set; }
public SelectList ProvinceList { get; set; }
}
调节器
public ActionResult Create()
{
UserViewModel model = new UserViewModel();
ConfigureViewModel(model);
return View(model);
}
public ActionResult Create(UserViewModel model)
{
if (!ModelState.IsValid)
{
ConfigureViewModel(model);
return View(model);
}
// Save and redirect
}
private void ConfigureViewModel(UserViewModel model)
{
var provinces = serviceClient.GetProvinces();
model.ProvinceList = new SelectList(provinces, "ProvinceId", "ProvinceName");
}
视图
@model UserViewModel
@using(Html.BeginForm())
{
....
@Html.LabelFor(m => m.ProvinceID)
@Html.DropDownListFor(m => m.ProvinceID, Model.ProvinceList, "Please select", new { @class="inputField" })
@Html.ValidationMessageFor(m => m.ProvinceID)
....
<input type="submit" />
}
请检查每个“ProvinceId”值是否为空,因为您拥有
var list = new SelectList(Provinces, "ProvinceId", "ProvinceName");
接着
var province = defaultItem.First(p => p.Value.Equals(selectedItem));
因此,根据斯蒂芬的例子,我剥离了我的观点,并逐渐添加了元素。事实证明,我的公司地址省与我的个人地址省相冲突。 这个问题是隧道视觉与空白参考例外的奇异位置相结合。 谢谢大家的意见和帮助!
链接地址: http://www.djcxy.com/p/72695.html上一篇: Why do I get a null exception on post in my DropDownListFor?
下一篇: DotNetOpenAuth...CreatRequest breaks on server (Works on my machine ;