2

ビュー (テキストボックスとチェックボックス) のフィールドをモデルに送信する際に問題が発生し、続行する方法がわかりません。モデルに送信するはずのボタンを押すたびに、コントローラーはビューによって設定されているはずのフィールドをチェックしますが、false を返し続けます。したがって、最初から設定されていないか、コントローラーが間違って読み取っています。いずれにせよ、私は途方に暮れています。助けてください:X

ビュー(やや簡略化):

@model Model

@Html.ValidationSummary()

@{ Html.BeginForm("PrintReport", "Controller", FormMethod.Get, new {     @class = "form_ll" }); }

<h1>@ViewBag.Title</h1>

<div class="group">
    @Html.ValidTextBoxFor(Model => Model.ToDate) 
    @Html.ValidTextBoxFor(Model => Model.FromDate)

    @Html.CheckBoxFor(Model => Model.Geplakt)
    @Html.CheckBoxFor(Model => Model.Geparafeerd)
    @Html.CheckBoxFor(Model => Model.Verschreven)
    @Html.CheckBoxFor(Model => Model.Geannuleerd)
    @Html.CheckBoxFor(Model => Model.Vermist)
    @Html.CheckBoxFor(Model => Model.Vernietigd)
    @Html.CheckBoxFor(Model => Model.Onbruikbaar)
    @Html.CheckBoxFor(Model => Model.Misdruk)
    @Html.CheckBoxFor(Model => Model.Teruggevonden)
    @Html.CheckBoxFor(Model => Model.InOnderzoek)
</div>
<div class="button">
    @Html.Button("Print")
</div>
@{ Html.EndForm(); }

モデル:

[Serializable]
public class Model : DomainObject
{
    [DataType(DataType.Date)]
    public DateTime? FromDate { get; set; }
    [DataType(DataType.Date)]
    public DateTime? ToDate { get; set; }

    public bool Geplakt { get; set; }
    public bool Geparafeerd { get; set; }
    public bool Verschreven { get; set; }
    public bool Geannuleerd  { get; set; }
    public bool Vermist  { get; set; }
    public bool Vernietigd { get; set; }
    public bool Onbruikbaar { get; set; }
    public bool Misdruk { get; set; }
    public bool Teruggevonden { get; set; }
    public bool InOnderzoek { get; set; }

    public Model()
    {
        // Constructor
    }               
}

コントローラ:

public class Controller : ModelController<Model>
{
    [HttpGet]
    public ActionResult Index()
    {
        Model = new Model();
        return InternalIndex();
    }

    [HttpGet]
    public ActionResult InternalIndex()
    {
        return View("Index", Model);
    }

    [HttpGet]
    public ActionResult PrintReport()
    {
        if (!Model.FromDate.HasValue || !Model.ToDate.HasValue)
            ModelState.AddModelError("Date", "At leaste one date is null");
        else {
            if (Model.FromDate.Value.CompareTo(Model.ToDate.Value) >= 0)
                ModelState.AddModelError("Date", "First date is later then the second one");
        }
        if(Model.IsAnythingChecked())
            ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes");

        if (ModelState.IsValid)
        {
            return View("PrintReport", Model);
        }
        else
        {
            return InternalIndex();
        }
    }            
4

5 に答える 5

4

POST の代わりに GET を使用しています。情報を受信して​​いないコントローラーにモデルを送信しています。1行はこれを読む必要があります:

@{ Html.BeginForm("PrintReport", "Controller", FormMethod.Post, new {     @class = "form_ll" }); }

また、モデルをコントローラーに送信し、コントローラーのメソッドを HttpPost に設定する必要があります。

    [HttpPost]
public ActionResult PrintReport(Model m)
{
    if (!Model.FromDate.HasValue || !Model.ToDate.HasValue)
        ModelState.AddModelError("Date", "At leaste one date is null");
    else {
        if (Model.FromDate.Value.CompareTo(Model.ToDate.Value) >= 0)
            ModelState.AddModelError("Date", "First date is later then the second one");
    }
    if(Model.IsAnythingChecked())
        ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes");

    if (ModelState.IsValid)
    {
        return View("PrintReport", Model);
    }
    else
    {
        return InternalIndex();
    }
}   

試してみてください。

于 2012-04-20T14:58:34.657 に答える
3

フォームデータをGET専用コントローラーにPOSTしているようです。また、モデルを期待するようにコントローラーに指示していません。これを試してください([HTTPGetデコレータ]の削除に注意してください:

public ActionResult PrintReport(Model m)
{
    if (!m.FromDate.HasValue || !m.ToDate.HasValue)
        ModelState.AddModelError("Date", "At leaste one date is null");
    else {
        if (m.FromDate.Value.CompareTo(m.ToDate.Value) >= 0)
            ModelState.AddModelError("Date", "First date is later then the second one");
    }
    if(m.IsAnythingChecked())
        ModelState.AddModelError("Checkboxes", "You haven't checked any checkboxes");

    if (ModelState.IsValid)
    {
        return View("PrintReport", Model);
    }
    else
    {
        return InternalIndex();
    }
}   

現在テストできるセットアップはありませんが、機能するはずです

于 2012-04-20T14:55:19.663 に答える
3

PrintReportアクション メソッドの 2 つのオーバーロードが必要です。

  • 属性を持つ[HttpGet]もの。これはあなたのウェブページを返すために使用されます
  • [HttpPost]タイプの引数を取る属性を持つものModel(モデルクラス。実際には、モデルが何であるかを説明する名前を持つように更新する必要があります)。これは、フォームが値を Web サーバーに送信するときに使用されます。

POST を実行してフォームを更新する必要があります (に変更FormMethod.Get) FormMethod.Post

その後、MVC モデル バインディングが残りを整理し、PrintReportアクション メソッドの 2 番目のオーバーロード用にモデル タイプのインスタンスを作成します。

于 2012-04-20T14:57:18.690 に答える
1

ビューに反映された変更を確認するには、コントローラーアクションのパラメーターとしてモデルを戻す必要があります。

public ActionResult PrintReport(Model model) {

于 2012-04-20T14:55:52.700 に答える
1

ModelController<Model>クラスの内容は?私の疑いは、あなたがそのクラスで新しいモデルを作成することであり、それはあなたが書いたときにあなたのコードが参照してif (!Model.FromDate.HasValueいるものです。

ただし、ビューがどのモデルについて返信しているかをコントローラーが知る方法はありません。これを変更するには、次の 3 つのことを行う必要があります。

  1. メソッドにパラメーターを追加して、PrintReport処理中のモデルを表し、Modelコードの代わりにそれを使用します。
  2. モデルをメソッドに渡すことができるように、PrintReportメソッドを でマークします。[HttpPost]
  3. Get の代わりに Post を使用するようにフォームを変更します。
于 2012-04-20T15:00:43.150 に答える