1

这是我的组合模型:

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>

这是什么原因?

注意:这个网站上有很多例子。我尝试了很多,但我找不到错误的原因。

谢谢。

4

4 回答 4

5

我不确定您是否发布了 POST 操作的完整代码,但如果您发布了,那就错了。

当您将数据发布到服务器时,您不会发布 SelectList 的值。您只发布选定的值。如果您只是将视图显示给用户,则 SelectList 将为空。您需要在 Post 中重新填充它:

[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。

于 2012-04-20T13:54:57.223 回答
2

我解决了

我用这个:

<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();
}

但我仍然不知道这是否是正确的方法。

于 2012-04-20T17:38:28.627 回答
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----")
于 2012-04-20T13:53:55.293 回答
0

问题在于:

[HttpPost] 
public ActionResult AddArticle(AddArticleModel AddArticleModel) 
{ 
    //Insert operations: 
    return View(AddArticleModel); 
} 

提交表单时,仅发布下拉列表中的选定项目。例如,如果您有一个包含 100 个选项的下拉列表,如果您选择一个选项,则在提交表单时,只会发送该选项。因此,modelbinder 没有足够的信息来重新创建您的下拉列表。

因此,在将模型传回视图之前,您需要重新填充下拉列表:

[HttpPost]  
public ActionResult AddArticle(AddArticleModel AddArticleModel)  
{  
    AddArticleModel.Categories = entity.TBL_CATEGORIES.Select(a => a);  

    return View(AddArticleModel);  
}  

您可以使用Fiddler2 自行检查

于 2012-04-20T14:01:18.433 回答