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

您正在使用 GET 而不是 POST。您将模型发送到未接收信息的控制器。一行应该是这样的:

@{ 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 控制器。此外,您还没有告诉控制器期待一个模型。试试这个(注意删除 [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动作方法的重载。

  • 一个有[HttpGet]属性的。这用于返回您的网页
  • 一个带有[HttpPost]属性的,它接受一个类型的参数Model(你的模型类,它真的应该更新为有一个描述它是什么模型的名称)。这在您的表单将值提交回 Web 服务器时使用。

您的表单应该更新做一个 POST(更改FormMethod.GetFormMethod.Post)。

然后,MVC 模型绑定应该为您整理其余部分,为您的PrintReport操作方法的第二次重载创建模型类型的实例。

于 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类似代码时所指的内容。

但是,您的控制器无法知道您的视图正在回发哪个模型。为了改变这一点,你需要做三件事:

  1. 向您的方法添加一个参数来PrintReport表示您正在处理的模型,并Model在您的代码中使用它而不是。
  2. 标记PrintReport方法,[HttpPost]以便模型可以传递给方法。
  3. 更改您的表单以使用 Post 而不是 Get。
于 2012-04-20T15:00:43.150 回答