将Razor视图字段绑定到MVC 3中的模型

时间:2012-04-20 14:49:49

标签: c# asp.net-mvc asp.net-mvc-3 razor

我在将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();
        }
    }            

5 个答案:

答案 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之类的代码所指的内容。

但是,您的控制器无法知道您的视图所发布的模型。为了改变这种情况,你需要做三件事:

  1. PrintReport方法中添加一个参数,以表示您正在处理的模型,并在代码中使用该参数代替Model
  2. 使用PrintReport标记[HttpPost]方法,以便可以将模型传递给方法。
  3. 将表单更改为使用Post而不是Get。