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)
        {
        }
    }

感谢

MVC在POST后发回模型属性

如果我理解得很好,当你这样做时:

@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
    ...
}