如何在回发之间维护对象?

时间:2013-01-10 06:15:56

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

我对使用MVC不太熟悉。我正在处理这种情况。一切正常,直到调用HttpPost方法,其中所有成员都为null。我不知道为什么不坚持它的所有数据。

一切都运作良好,因为我可以在我的Html页面中看到数据,只有当用户提交信息时才会发生这种情况。

    [HttpGet]
    public ActionResult DoTest()
    {
        Worksheet w = new Worksheet(..);
        return View(w);
    }

    [HttpPost]
    public ActionResult DoTest(Worksheet worksheet)
    {
        return PartialView("_Problems", worksheet);
    }

enter image description here

这是我正在使用的课程。

public class Worksheet
{
    public Worksheet() { }

    public Worksheet(string title, List<Problem> problems)
    {
        this.Title = title;
        this.Problems = problems;
    }

    public Worksheet(IEnumerable<Problem> problems, WorksheetMetadata metadata, ProblemRepositoryHistory history)
    {
        this.Metadata = metadata;
        this.Problems = problems.ToList();
        this.History = history;
    }

    public string Title { get; set; }
    public List<Problem> Problems { get; set; }  // Problem is an abstract class
    public WorksheetMetadata Metadata { get; set; }
    public ProblemRepositoryHistory History { get; set; }
}

我的剃刀视图......剃须刀视图成功显示了我的观点。我意识到一些罕见的事情,请注意我的5和6行我有HiddenFor方法,如果我使用它,当调用HTTPPOST持久化数据时,我不知道为什么。

@model Contoso.ExercisesLibrary.Core.Worksheet

<div id="problemList">
<h2>@Html.DisplayFor(model => model.Metadata.ExerciseName)</h2>
    @Html.HiddenFor(model => model.Metadata.ExerciseName)
    @Html.HiddenFor(model => model.Metadata.ObjectiveFullName)

@for (int i = 0; i < Model.Problems.Count; i++)
{
    <div>
    @Html.Partial(Contoso.ExercisesLibrary.ExerciseMap.GetProblemView(Model.Problems[i]), Model.Problems[i])
    </div>
}
</div>

UPDATE 我正在使用静态类来获取视图名称,但正如我正在测试我只是使用此部分视图

@model Contoso.ExercisesLibrary.AbsoluteArithmetic.Problem1
<div>

    <span style="padding:3px; font-size:18px;">@Model.Number1</span>
    <span style="padding:5px; font-size:18px;">+</span>
    <span style="padding:5px; font-size:18px;">@Model.Number2</span>
    <span style="padding:5px; font-size:18px;">=</span>

    <span style="font-size:18px">
            @Html.EditorFor(model => model.Result, new { style = "width:60px; font-size:18px;" })
            @Html.ValidationMessageFor(model => model.Result)
    </span>
</div>

@section Scripts {

}

此处用户点击

@model Contoso.ExercisesLibrary.Core.Worksheet

<form method="post">
    @Html.Partial("_Problems", Model)

    <input type="submit" value="Continue" />
</form>

5 个答案:

答案 0 :(得分:2)

Model Binder会将视图“绑定”或链接到模型的input字段。它不会绑定显示字段(如标签),这就是为什么你需要HiddenFor它会添加一个<input type="hidden",然后在发布时绑定到模型。

答案 1 :(得分:1)

您可以使用'TempData'。它用于将数据从当前请求传递到后续请求意味着重定向。

此链接也可以帮助您。

TempData

SO Tempdata

答案 2 :(得分:0)

确保您的表单标记如下所示,例如控制器名称,操作方法,表单方法和表单的ID。我指的是@using声明。在我的例子中,控制器名称是RunLogEntry,操作方法是Create,id是表单。

从视图到控制器的正常发布

@using (Html.BeginForm("Create", "RunLogEntry", FormMethod.Post, new { id = "form", enctype = "multipart/form-data" }))
    {
        <div id="main">
            @Html.Partial("_RunLogEntryPartialView", Model)
        </div>
    }

如果您想通过Jquery发布,可以执行以下操作:

$.post("/RunLogEntry/LogFileConfirmation",
              $("#form").serialize(),
               function (data) {
                   //this is the success event
                   //do anything here you like
                                                            }, "html");

答案 3 :(得分:0)

您必须在视图中指定具有正确属性的表单才能执行后期操作

<form action="Test/DoTest" method="post">
...
</form>

@using(Html.BeginForm("DoTest", "Test", FormMethod.Post)) {
...
}

建议使用第二个。

答案 4 :(得分:0)

将整个HTML代码放在:

@using(Html.BeginForm())

标签