2

私はMVCの使用経験があまりありません。私はこの状況に対処しています。すべてのメンバーが null である 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>

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

5 に答える 5

3

Model Binderは、inputビューのフィールドをモデルに「バインド」またはリンクします。表示フィールド (ラベルなど) をバインドしません。そのため、投稿時にモデルにバインドされる をHiddenFor追加する必要があります。<input type="hidden"

于 2013-01-10T06:21:54.400 に答える
1

「TempData」を使用できます。リダイレクトの場合に、現在のリクエストから後続のリクエスト手段にデータを渡すために使用されます。

このリンクも役に立ちます。

温度データ

SO 温度データ

于 2013-01-10T06:28:56.290 に答える
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");
于 2013-01-10T06:27:40.987 に答える
0

投稿アクションを実行するには、ビューで正しい属性を持つフォームを指定する必要があります

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

また

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

2番目が推奨されます。

于 2013-01-10T06:27:51.820 に答える
0

HTML コード全体を以下に配置します。

@using(Html.BeginForm())

鬼ごっこ。

于 2013-01-10T09:30:43.707 に答える