これは簡単だと思いますが、よく検索していない可能性があります...
部分ビューから結果をモデルやコントローラーに戻す方法を知りたいです。
ユーザーが 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");
}