在post方法中,如何获取紧凑参数而不是所有对象属性

时间:2013-04-12 02:58:50

标签: asp.net-mvc asp.net-mvc-4 controller

也许标题不是那么明确。让我解释一下我的情况

我的控制器中有get和post方法。在GET方法中,从数据库上下文中获取实体

    [HttpGet]
    public ActionResult RecheckAssignment(short id)
    {
        var assignment = db.Assignments.Find(id);
        Session["QuestionList"] = QuestionRepositoryManager.GetAllPossibleQuestionsFromJson(assignment.Content);  // it's a list!

        return View(Session["QuestionList"]);
    }

分配实体包含10个属性。当我在模型中显示这些实体时,它会显示使用所有属性,但是当用户发布时,应该在POST METHOD中只获取它的两个属性(Id string,Changed bool)。

我没有把什么放在方法参数里面。

    [HttpPost]
    public ActionResult RecheckAssignment(...)
    {
        return View();
    }

我把所有内容放在会话变量中,因为稍后我必须再次获取实体,我想这是一个使用Session的好选项,但我不确定。

那么,我应该在方法内部编写什么才能获得Id和Changed属性来更新实体。

1 个答案:

答案 0 :(得分:1)

当ASP.NET MVC在<form>期间将POST映射回Action时,它将填充它可以执行的操作。考虑这样一个类:

public class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}

现在考虑这种形式:

@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post))
{
    Html.TextBoxFor(m => m.Make)
}

现在考虑这个动作:

public ActionResult ActionName(Car model)
{
    // the values of Car will look like this
    model.Make   // this will be what was in the text box
    model.Model  // this will be null
    model.Year   // this will be 0
}

并注意null0是这些类型的默认值。所以,如果我想POST属性Model,我需要在表单中获取它。我可以使用@Html.TextBoxFor执行此操作,但如果我不希望用户看到该怎么办?好吧,我也可以这样做:

Html.HiddenFor(m => m.Model);

现在,当表单为POST时,它将使用下载的值填充Model。因此,只需确保您需要的所有属性在某种程度上都是