1

車の情報を取得するために VIN デコーダーを使用するオプションがあるアプリケーションに取り組んでいます。VINを入力するか、ドロップダウン、メーカー、年、メーカー、モデルなどから選択できます。

製造元のドロップダウンは、ページで初期化された唯一のものであり、値は選択されていません。製造業者を選択すると、その製造業者で利用可能なすべての年が検索され、製造年のリストと、選択された製造業者のリストが返されます。年を選択すると、利用可能なメーカー、年、型式のリストが返され、選択されたメーカーと選択された年が両方とも識別され、以下同様にアプリケーションを通じて表示されます。

このワークフローは正常に機能し、すべてのドロップダウンが正しく表示されます。ただし、VIN を入力するときは、それぞれの値を選択し、使用可能なオプションのリストを見つけて、その時点まで誰かが手動でオプションを選択した場合とまったく同じようにページをレンダリングします。メーカー以外でこれを行うと、すべてのドロップダウンが適切に選択された属性で正しくレンダリングされます。

私はそれを可能な限り分離しようとしましたが、他のすべてを取り除いた結果、次のようになりました。

意見:

@model My_Project.Models.Data 

@using System.Web.Helpers

@using (Html.BeginForm("Temp", "Home", FormMethod.Post, new { id = "formIndex" }))
{
    <div>
        VIN:&nbsp;
        @Html.TextBox("vin", Model.VIN) <button type="submit">Go!</button>
    </div>
    <div>
        Manufacturer: (@Model.ManufacturerId)
        @Html.DropDownListFor(m => m.ManufacturerId, Model.Manufacturers, new { style = "width: 175px;" })
    </div>
}

モデル:

namespace My_Project.Models
{
    [Serializable]
    public class Data
    {
        public string VIN { get; set; }
        public int ManufacturerId { get; set; }
        public SelectList Manufacturers { get; set; }
    }
}

コントローラ:

public ActionResult Temp()
{
    Data model = new Data
    {
        Manufacturers = DBAccess.getManufacturers()
    };

    Session["ModelData"] = model;

    return View(model);
}

[HttpPost]
public ActionResult Temp(Data newData)
{
    Data oldData = Session["ModelData"] as Data;

    oldData.ManufacturerId = 20;

    Session["ModelData"] = oldData;

    return View(oldData);
}

Temp() で ManufacturerId を設定すると、ドロップダウン リストは選択したメーカーで正しくレンダリングされます。ただし、投稿応答で設定されている場合、ドロップダウン リストにはすべての正しいオプションが表示されますが、正しいメーカーが選択されていません。ビューを見ると、実際には、manufacturerId を表示して、データが正しく取得されていることを確認しています。manufacturerId はリストにある値に設定されていますが、選択されていません。

ビューのレンダリングに使用されるモデルが同一に見えることを考えると、これら 2 つのインスタンスの違いが何であるかを理解できません。その上、製造元を選択して post メソッドを呼び出すと (この時点でその機能を取り除いています)、同じモデルが返されますが、正しくレンダリングされます。

投稿から戻ったときにこれが正しくレンダリングされない原因は何ですか?

4

1 に答える 1

1

value を設定する必要がある場合は、新しい値でfrom controller post methodを更新する必要があると思います。ModelState更新されたモデルをビューに渡しても、ModelState がまだ古い値を保持しているためだと思います。

これを試して:

[HttpPost]
public ActionResult Temp(Data newData)
{
    Data oldData = Session["ModelData"] as Data;
    oldData.ManufacturerId = 20;
    Session["ModelData"] = oldData;

    //Update model state with new ManufacturerId here
    CultureInfo myCulture = new System.Globalization.CultureInfo("en-GB");
    ModelState.SetModelValue("ManufacturerId", 
                             new ValueProviderResult((object)oldData.ManufacturerId, 
                                 oldData.ManufacturerId.ToString(), myCulture));

    return View(oldData);
}
于 2013-11-14T16:46:10.857 に答える