这是我的组合模式:
public class AddArticleModel
{
public TBL_ARTICLES Article { get; set; }
public IEnumerable<TBL_CATEGORIES> Categories { get; set; }
}
和使用模型的控制器。
public ActionResult AddArticle()
{
AddArticleModel AddArticleModel = new AddArticleModel();
AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);
return View(AddArticleModel);
}
观看:
@model DunyaYazilim.Models.AddArticleModel
@{
ViewBag.Title = "AddArticle";
}
@using (Html.BeginForm((string)ViewBag.FormAction, "Home"))
{
<fieldset>
<legend>Add Article Form</legend>
<ol>
<li>
@Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c.Name, Value = c.CategoryID.ToString() }), "-----Select Category----")
</li>
</ol>
<input type="submit" value="Send" />
</fieldset>
}
在控制器中发布方法:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel)
{
//Insert operations:
return View(AddArticleModel);
}
我的问题:当我发布表单时,发生错误:对象引用未设置为对象的实例。排队:13
Line 12: <li>
Line 13: @Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c.Name, Value = c.CategoryID.ToString() }), "-----Select Category----")
Line 14: </li>
Line 15: <li>
这是什么原因?
注意:本网站有很多考试。我试了很多,但我找不到错误的原因。
感谢。
答案 0 :(得分:5)
我不确定你是否发布了POST操作的完整代码,但是如果你这样做,那就错了。
将数据发布到服务器时,您不会发布SelectList的值。您只发布所选值。如果您只是将视图显示回用户,则SelectList将为null。你需要在帖子中重新填充它:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel)
{
AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);
return View(AddArticleModel);
}
如果您只想返回所选类别(看起来很奇怪),可以这样做:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel)
{
AddArticleModel.Categories = entity.TBL_CATEGORIES.Where(a => a.CategoryId == AddArticleModel.CategoryId);
return View(AddArticleModel);
}
这假定您的视图模型上的属性是CategoryId,并且TBL_CATEGORIES实体上的属性也是CategoryId。
答案 1 :(得分:1)
我解决了它
我用过这个:
<div>@Html.DropDownList("CategoryID", new SelectList(Model.Categories, "CategoryID", "Name"),"-----Select Category-----")</div>
和我的控制员:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel,String CategoryID)
{
TBL_ARTICLES article = AddArticleModel.Article;
article.CategoryID = Int32.Parse(CategoryID);
//some code...
return View();
}
但我仍然不知道这是否正确。
答案 2 :(得分:0)
检查Model.Categories在条件中是否为空。
@Html.DropDownListFor(m => m.Categories, Model.Categories != null ?
Model.Categories.Select
(
c => new SelectListItem
{
Text = c.Name,
Value = c.CategoryID.ToString()
}) : null, "-----Select Category----")
答案 3 :(得分:0)
问题在于:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel)
{
//Insert operations:
return View(AddArticleModel);
}
提交表单时,仅过帐下拉列表中选定的项目。因此,例如,如果您有一个包含100个选项的下拉列表,如果您选择一个选项,则在提交表单时,只会发送一个选项。因此,模型绑定器没有足够的信息来重新创建下拉列表。
因此,您需要在将模型传递回视图之前重新填充下拉列表:
[HttpPost]
public ActionResult AddArticle(AddArticleModel AddArticleModel)
{
AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);
return View(AddArticleModel);
}
您可以使用Fiddler2自行检查。