1

注:以下のコメントと回答を考慮してコードを更新しました。

私の MVC アプリでは、他のオブジェクト (多対多の関係や 1 対多の関係など) への参照を作成する必要がある場合があります。

だから私はこのモデルを持っています:

public class ObjInfo
    {
        [Required(ErrorMessage = "Obj ID is required.")]
        [Display(Name = "ObjID")]
        public int m_Id { get; set; }

        [Required(ErrorMessage = "Obj Name is required.")]
        [Display(Name = "Obj Name")]
        public string m_Name { get; set; }

        [Display(Name = "Obj Number")]
        public int m_Number { get; set; }

        (...)

        [Required(ErrorMessage = "Other Obj is required.")]
        [Display(Name = "OtherObj")]
        public int m_OtherObjID { get; set; }

        public OtherObjInfo m_OtherObj { get; set; }

        (...)
    }

デフォルトとパラメーターのコンストラクターもあり、必要に応じて表示できますが、それらに問題があるかどうかはわかりません。ともかく。

私のコントローラーには、MVC メソッドに続く 2 つの create メソッドがあります。

        //
        // GET: /Obj/Create

        public ActionResult Create()
        {
            ViewBag.List = new SelectList(PopulateDDLs(), "OtherObj", "Other obj ID");
            return View();
        }

        //
        // POST: /Obj/Create

        [HttpPost]
        public ActionResult Create(Objinfo obj)
        {
            if (ModelState.IsValid)
            {
                m_ObjManager.CreateObj(obj);
                return RedirectToAction("SearchIndex");
            }

            ViewBag.List = new SelectList(PopulateDDLs(), "OtherObj", "Other obj ID");
            return View(obj);
        }

そして最後に、「Create」ビューのコーディング方法は次のとおりです。

@model MyApp.Models.ObjInfo

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>OBJ</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.m_Id)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.m_Id)
            @Html.ValidationMessageFor(model => model.m_Id)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.m_Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.m_Name)
            @Html.ValidationMessageFor(model => model.m_Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.m_Number)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.m_Number)
            @Html.ValidationMessageFor(model => model.m_Number)
        </div>

        (...)

        <div class="editor-label">
            @Html.LabelFor(model => model.m_OtherObj , "Other Obj")
        </div>
        <div class="editor-field">
            @Html.DropDownList(model => model.m_OtherObjID, ViewBag.List as SelectList, "--- Select Other Obj ---", new {@class = "OtherObjInfo "})
            @Html.ValidationMessageFor(model => model.m_OtherObj)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

基本的に、問題は、「作成」ボタンをクリックするたびに、ドロップダウンリストで何かが選択されていても、OtherObj の ModelState 検証が常に false になることです。この値を除いて、他のすべての値は正しいです。

理由がわかりません。ご協力いただきありがとうございます。

コード編集後**

「作成」ビューに入るとクラッシュします。

DataBinding: 'System.String' does not contain a property with the name 'OtherObj'.

私のdropdownlistforが配置されている行に正確に。

datavalueField と dataTextField は正確に何を参照することになっていますか?

4

1 に答える 1

1

otherObjectIdモデルに追加

public class ObjInfo
{
    public int m_Id { get; set; }

    ...

    [Required(ErrorMessage = "Other Obj is required.")]
    [Display(Name = "OtherObj")]
    public int otherObjectId { get; set; }

    public OtherObjInfo m_OtherObj { get; set; }

    ...

}

コントローラ

public ActionResult Create()
{
    ViewBag.List = new SelectList(PopulateDDLs(), "Id", "Name"); 
    return View();
}

[HttpPost]
public ActionResult Create(Objinfo obj)
{
    if (ModelState.IsValid)
    {
        m_ObjManager.CreateObj(obj);
        return RedirectToAction("SearchIndex");
    }

    ViewBag.List = new SelectList(PopulateDDLs(), "Id", "Name"); 
    return View(obj);
}

見る

<div class="editor-label">
    @Html.LabelFor(model => model.m_OtherObj , "Other Obj")
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.otherObjectId, ViewBag.List as SelectList, "--- Select Category ---", new { @class = "some_class" })
    @Html.ValidationMessageFor(model => model.m_OtherObj)
</div>

より良い方法は、強く型付けされたヘルパーを使用することです。ドロップダウンリストを除くすべてのヘルパーはstrongly-typed(editorfor、textboxfor、dropdownlistfor、...)です。

DDL値をモデルにバインドする場合は、dropdownlistforの代わりにを使用する必要がありdropdownlistます。

必要な値をDDLとしてモデルにバインドしないため、モデルの状態は無効です。

于 2013-02-20T16:44:13.163 に答える