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は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であることを前提としています。

于 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

問題はこれにあります:

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

フォームが送信されると、ドロップダウンの選択されたアイテムのみが投稿されます。したがって、たとえば、100個のオプションを含むドロップダウンリストがある場合、1つのオプションを選択すると、フォームを送信するときに、その1つのオプションのみが送信されます。その結果、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 に答える
0

Model.Categoriesが条件でnullではないことを確認してください。

@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 に答える