我确信这很容易,但也许我搜索不好......
我想知道如何将部分视图的结果返回到模型和/或控制器。
如果用户输入FirstName,Gender(来自下拉列表)和Grade(来自下拉列表),我只会在模型中找到FirstName和Gender。我想知道如何从局部视图中下拉到模型中获得等级,所以我可以在控制器中看到它。
请在控制器代码中查找此问题:
我需要做什么才能让分部类的GradeLevel在这里:<<<<<<<
注意:这不是确切的代码。可能会有一些微不足道的错字。
编辑:显然你不能添加长评论,所以我将在这里添加:
谢谢汤姆和Mystere Man。汤姆让我思考为什么它不起作用。我没有想到通过模型绑定。根据我提出的设计,HTML会被渲染,等级下拉有这个ID:“等级”。我要绑定的模型上的属性是:“GradeLevelID”。如果我将局部视图中的帮助器更改为@ Html.DropDownList(“GradeLevelID”......它可以很好地工作。
但这不是一个好的解决方案。我的想法是从主视图中抽象出部分视图。这个名字的硬编码打击了!我做了一个略微改进的解决方案。在主视图中,我更改了@ Html.Partial语句以将模型属性名称传递给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>
}
@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");
}
答案 0 :(得分:1)
尝试这样做,以便在元素发布时获得正确的命名。
在您的主视图
上 @Html.Partial("GradeDropDown", Model) //Pass the Model to the partial view
这是您的部分视图(名为“GradeDropDown”):
@model RegisterModel
@Html.DropDownList("Grade", (SelectList)Model.GradeLevelSelectList)
答案 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>