我有一个模型,我在GET方法中发送到视图,并成功绑定到TextFor
和ListFor'
e.g。
@Html.ListBoxFor(x => x.MultiChoice, new MultiSelectList(Model.property, "Id", "Name"), new { multiple = "multiple", @class = "multiselect" })
当用户提交表单时,Model会成功传递回POST操作方法及其属性。
[HttpPost]
public ActionResult POST(Model quiz)
{
string Q1 = quiz.Q1 // = will equal what the user has put in. good
return View("Quiz", quiz);
}
但是,当模型(测验)返回到视图时,测验模型中的属性为NULL,如何保留POST方法中的属性?
**编辑**
GET方法
[HttpGet]
public ActionResult Quiz()
{
try
{
Quiz quiz = new Quiz();
// Of course, I could do this in the constructor of the model..
InitialiseQuiz(Quiz);
return View("Quiz", quiz");
}
catch (Exception ex)
{
}
}
由于
答案 0 :(得分:1)
模型绑定器用它拥有的任何POST数据来新闻该类的实例。任何null都没有发布数据。那么,使它不为空的最简单方法是为该属性创建一个HTML输入,以便为它发布一些内容。
但是,在您处理现有数据的情况下,最好只发布您需要发布的内容,然后再次查找原始对象,以便将原始属性值映射回传入的版本你的行动:
[HttpPost]
public ActionResult Quiz(int id, Quiz model)
{
var quiz = db.Quizzes.Find(id);
// assuming `Foo` was a property that was not posted
model.Foo = quiz.Foo
...
}
答案 1 :(得分:1)
如果我理解得很好,当你这样做时:
@Html.ListBoxFor(x => x.MultiChoice, new MultiSelectList(Model.property, "Id", "Name"))
Razor会创建一个<select>
代码,其x.MultiChoice
个值作为选定选项。但是,Model.property
值不会持久存在(因为它可能是一个集合,对吧?)。
因此,当您执行POST时,您只会将x.MultiChoice
值发送回服务器,并且将错过Model.property
集合。
知道这一点,您只需要在POST操作期间再次使用该集合填充此属性,例如:
[HttpPost]
public ActionResult POST(Model quiz)
{
// some code here
quiz.property = new CollectionOfSomething();
return View("Quiz", quiz);
}
这就是你要找的东西吗?