MVC在POST后发回模型属性

时间:2014-10-30 16:21:37

标签: c# asp.net-mvc

我有一个模型,我在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)
        {

        }
    }

由于

2 个答案:

答案 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);
}

这就是你要找的东西吗?