MVC在POST后发回模型属性
本文关键字:模型 属性 POST MVC | 更新日期: 2023-09-27 18:28:24
我有一个模型,我用GET方法将其发送到视图,并成功绑定到TextFor
和ListFor的
例如
@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)
{
}
}
感谢
如果我理解得很好,当你这样做时:
@Html.ListBoxFor(x => x.MultiChoice, new MultiSelectList(Model.property, "Id", "Name"))
Razor将创建具有CCD_ 3值作为所选选项的CCD_。但是,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);
}
这就是你要找的吗?
modelbinder用它所拥有的POST数据来更新该类的一个实例。任何为null的内容都没有发布的数据。因此,使其不为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
...
}