0

私は自分自身にasp.netmvc3を教えています。ユーザーがプロパティの詳細をWebサイトにアップロードできる「プロパティの追加」フォームがあります。私は長い間このエラーに苦しんでいます。

簡単にするために、データベースに2つのテーブルがあると考えてみましょう。

CustomerTypes:データベースには、1つの所有者、2つのブローカー、3つのコマーシャルなどがあります。プロパティ:これは、フォームによって入力されるテーブルです。

CustomerTypes(および他のそのようなテーブル)を使用してラジオボタンを作成します。ユーザーはフォームに入力し、「顧客タイプ」の選択肢を選択します。ただし、送信時に「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。これは、Model.CustomerTypesに「null」が設定されているためです。ただし、Model.CustomerTypesは、ラジオボタンの作成にのみ使用されます。何が悪いのかわかりません。コードは以下のとおりです。

意見:

@model Website.ViewModels.AddPropertyViewModel

<fieldset>
    <legend>Property</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Property.CustomerType)
        @foreach (var item in Model.CustomerTypes)
        {
            @Html.RadioButtonFor(model => model.Property.CustomerType, Convert.ToInt32(item.Value)) @item.Text
        }
    </div>

    ...

AddPropertyViewModel:

namespace Website.ViewModels
{
    public class AddPropertyViewModel
    {
        public Property Property { get; set; }
        ...

        public IEnumerable<SelectListItem> CustomerTypes { get; set; }
        ...
    }

コントローラ:

public ActionResult AddProperty()
    {
        AddPropertyViewModel viewModel = new AddPropertyViewModel
        {
                ...
            CustomerTypes = websiterepository.GetCustomerTypeSelectList(),
                ...
        };
        return View(viewModel);

GetCustomerTypeSelectList関数は次のとおりです。

public IEnumerable<SelectListItem> GetCustomerTypeSelectList()
{
    var customerTypes = from p in db.CustomerType
                            orderby p.CustomerTypeDescription
                            select new SelectListItem
                            {
                                Text = p.CustomerTypeDescription,
                                Value = SqlFunctions.StringConvert((double)p.CustomerTypeId)
                            };
    return customerTypes;
}

POSTの値は、選択に基づいてProperty_CustomerTypeに正しく設定されます

---詳細情報を追加---フォームを次のように開始します。

@using (Html.BeginForm("AddProperty", "Property", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
...
}

コントローラは次のとおりです。

[HttpPost]
public ActionResult AddProperty(AddPropertyViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // 
        if (viewModel.File1.ContentLength > 0)
        {
            var fileName = Path.GetFileName(viewModel.File1.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
            viewModel.File1.SaveAs(path);
        }

        var property = viewModel.Property;
        websiterepository.Add(property);
        return RedirectToAction("Index", "Home");
    }

    return View(viewModel);
}

エラーのスクリーンショットは次のとおりです。 ここに画像の説明を入力してください

これらのラジオボタンにコメントするフォームを送信してみましたが、機能します。

4

1 に答える 1

1

問題はCustomerTypes、サーバーに投稿した後にビューをレンダリングするときにデータが入力されないことです。

実行されているアクションのフローを見ると、

  1. CustomerTypes最初のページをレンダリングする前にコレクションにデータを入力します
  2. データをサーバーにポストバックしますが、CustomerTypesコレクションは保持しません(必要がないため)
  3. ビューを再度レンダリングしますが、今回はデータを入力せずにレンダリングします CustomerTypes
  4. カブーム!

ビューを2回返す前にCustomerTypesプロパティにデータを入力すると、問題が解決するはずです。

[HttpPost]
public ActionResult AddProperty(AddPropertyViewModel viewModel)
{
 [...]

 viewModel.CustomerTypes = websiterepository.GetCustomerTypeSelectList();

 return View(viewModel);
}
于 2012-09-23T08:23:30.060 に答える