我在将View(文本框和复选框)中的字段提交给我的模型时遇到问题,但我不确定如何继续。每当我点击应该提交给模型的按钮时,控制器都会检查应该由视图设置的字段,但保持返回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();
}
}
答案 0 :(得分: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();
}
}
试一试。
答案 1 :(得分: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();
}
}
我目前没有可用于测试的设置,但这应该可行
答案 2 :(得分:3)
您需要对PrintReport
操作方法进行两次重载。
[HttpGet]
属性的人。这用于返回您的网页[HttpPost]
属性的属性,其类型为Model
的参数(您的模型类,真的应更新为具有描述其内容的名称一个模型)。当您的表单将值提交回Web服务器时使用。您的表单应该更新POST(将FormMethod.Get
更改为FormMethod.Post
)。
然后MVC模型绑定应该为您排序,为您的PrintReport
操作方法的第二次重载创建模型类型的实例。
答案 3 :(得分:1)
您需要将模型作为控制器操作的参数传回,以查看视图中反映的更改,即
public ActionResult PrintReport(Model model) {
答案 4 :(得分:1)
您ModelController<Model>
课程的内容是什么?我怀疑你在那个类中创建了一个新模型,这是你编写if (!Model.FromDate.HasValue
之类的代码所指的内容。
但是,您的控制器无法知道您的视图所发布的模型。为了改变这种情况,你需要做三件事:
PrintReport
方法中添加一个参数,以表示您正在处理的模型,并在代码中使用该参数代替Model
。PrintReport
标记[HttpPost]
方法,以便可以将模型传递给方法。