2

我对使用 MVC 的经验并不丰富。我正在处理这种情况。一切正常,直到调用所有成员为空的 HttpPost 方法。我不知道为什么不保留所有数据。

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

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

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

在此处输入图像描述

这是我正在使用的课程。

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>

更新我正在使用静态类来获取视图名称,但是当我正在测试时,我只是在使用这个部分视图

@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>
4

5 回答 5

3

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

于 2013-01-10T06:21:54.400 回答
1

您可以使用“临时数据”。它用于将数据从当前请求传递到后续请求,以防重定向。

这个链接也可以帮助你。

临时数据

SO 临时数据

于 2013-01-10T06:28:56.290 回答
0

确保您的表单标签如下所示,例如控制器名称、操作方法、表单方法和表单的 id。我指的是@using 语句。在我的例子中,控制器名称是 RunLogEntry,action 方法是 Create,id 是 form。

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

@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");
于 2013-01-10T06:27:40.987 回答
0

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

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

或者

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

推荐第二种。

于 2013-01-10T06:27:51.820 回答
0

将整个 HTML 代码放在:

@using(Html.BeginForm())

标签。

于 2013-01-10T09:30:43.707 回答