2

これは簡単だと思いますが、よく検索していない可能性があります...

部分ビューから結果をモデルやコントローラーに戻す方法を知りたいです。

ユーザーが FirstName、Gender (ドロップダウンから)、および Grade (ドロップダウンから) を入力すると、モデルで FirstName と Gender のみが見つかります。部分ビューのドロップダウンから Grade をモデルに戻す方法を知りたいので、コントローラで見ることができます。

コントローラーコードでこの質問を探してください:

部分クラスから GradeLevel を取得するにはどうすればよいですか: <<<<<

注: これは正確なコードではありません。小さな、些細なタイプミスがあるかもしれません。

編集:どうやら長いコメントを追加できないようですので、ここに追加します:

ありがとう、トムとミスティアマン。トムはなぜそれがうまくいかないのか考えさせられた. モデルバインディングについては考えていませんでした。私が提案したデザインでは、HTML がレンダリングされ、Grade ドロップダウンに「Grade」という ID が表示されます。バインドしたいモデルのプロパティは「GradeLevelID」です。部分ビューのヘルパーを @Html.DropDownList("GradeLevelID" ... に変更すると、完全に機能します。

しかし、それは良い解決策ではありません。私のアイデアは、メイン ビューから部分ビューを抽象化することでした。名前をハードコーディングすると、それが吹き飛ばされます! 少し改善されたソリューションを作成しました。メイン ビューで、@Html.Partial ステートメントを変更して、モデル プロパティ名をパーシャルに渡します。そのような:

@Html.Partial("GradeDropDown", (SelectList)Model.GradeSelectList, new ViewDataDictionary { { "modelPropertyName", "GradeLevelID" } })

次に、部分ビューを次のように変更できます

@model System.Web.Mvc.SelectList
@Html.DropDownList((string)ViewData["modelPropertyName"], Model)

しかし、それは物事にアプローチするためのばかげた方法のようにも思えます。助けてくれてありがとう。EditorTemplates を見ていきます。


これが私のモデルです:

public class RegisterModel{

    public MemberRegistration MemberRegistration{
        get{
            if (HttpContext.Current.Session["MemberRegistration"] == null){
                return null;
            }
            return (MemberRegistration)HttpContext.Current.Session["MemberRegistration"];

        }

        set{
            HttpContext.Current.Session["MemberRegistration"] = value;
        }

    }

    public string FirstName{
        get{
            return MemberRegistration.FirstName;
        }
        set{
            MemberRegistration.FirstName = value;
        }
    }

    public SelectList GenderSelectList{
        get{

            List<object> tempList = new List<object>();

            tempList.Add(new { Value = "", Text = "" });
            tempList.Add(new { Value = "M", Text = "Male" });
            tempList.Add(new { Value = "F", Text = "Female" });

            return new SelectList(tempList, "value", "text", MemberRegistration.Gender);
        }
    }

    [Required(ErrorMessage = "Gender is required")]
    public string Gender{
        get{
            return MemberRegistration.MemberPerson.Gender;
        }
        set{
            MemberRegistration.MemberPerson.Gender = value;
        }
    }

    public SelectList GradeLevelSelectList{
        get{
            List<object> tempList = new List<object>();

            tempList.Add(new { Value = "", Text = "" });
            tempList.Add(new { Value = "1", Text = "1st" });
            tempList.Add(new { Value = "2", Text = "2nd" });
            tempList.Add(new { Value = "3", Text = "3rd" });
            tempList.Add(new { Value = "4", Text = "4th" });

            return new SelectList(tempList, "value", "text", MemberRegistration.GradeLevel);
        }
    }

    [Required(ErrorMessage = "Grade is required")]
    public Int32 GradeLevel{
        get{
            return MemberRegistration.GradeLevel;
        }
        set{
            MemberRegistration.GradeLevel = value;
        }
    }
}

これが私の主な見解です:

@model RegisterModel

@using (Html.BeginForm())
{
   <p class="DataPrompt">
        <span class="BasicLabel">First Name:</span>
        <br />
        @Html.EditorFor(x => x.FirstName)
    </p>

    <p class="DataPrompt">
        <span class="BasicLabel">Gender:</span>
        <br />
        @Html.DropDownListFor(x => x.Gender, Model.GenderSelectList)
    </p>

    <p class="DataPrompt">
        <span class="BasicLabel">Grade:</span><span class="Required">*</span>
        <br />
        @Html.Partial("GradeDropDown", (SelectList)Model.GradeLevelSelectList)
    </p>

    <p class="DataPrompt">
        <input type="submit" name="button" value="Next" />
    </p>

}

これが私の部分的なビューです(「GradeDropDown」という名前):

@model System.Web.Mvc.SelectList

@Html.DropDownList("Grade", Model)

これが私のコントローラーです:

[HttpPost]
public ActionResult PlayerInfo(RegisterModel model)
{
    string FirstName = model.Registration.FirstName;
    string Gender = model.Registration.Gender;

    >>>>> What do I need to do to get the GradeLevel from the partial class to be here: <<<<<
    Int32 GradeLevel = model.Registration.GradeLevel;           

    return RedirectToAction("Waivers");
}
4

2 に答える 2

1

投稿されたときに要素の正しい名前を取得するには、これを試してください。

メインビューで

 @Html.Partial("GradeDropDown", Model) //Pass the Model to the partial view

これが部分的なビューです (「GradeDropDown」という名前):

 @model RegisterModel

   @Html.DropDownList("Grade", (SelectList)Model.GradeLevelSelectList)
于 2012-05-03T17:16:55.530 に答える
1

なぜ部分ビューを使用しているのかさえわかりません。ヘルパー メソッドを 1 つ使用するだけで、部分ビューをビュー内のヘルパー メソッドに置き換えることができ、コードが少なくなります。

Html.DropDownListFor()次に、代わりにを使用する必要がありHtml.DropDownList()ます。そうすれば、html コントロールに正しく名前が付けられます。

これを行うだけです:

<p class="DataPrompt"> 
    <span class="BasicLabel">Grade:</span><span class="Required">*</span> 
    <br /> 
    @Html.DropDownListFor(m => m.GradeLevel, (SelectList)Model.GradeLevelSelectList) 
</p> 
于 2012-05-03T17:26:51.943 に答える