【问题标题】:Can not pass data from a view to a controller无法将数据从视图传递到控制器
【发布时间】:2013-04-09 08:51:23
【问题描述】:

我开始使用 MVC,目前正在开发一个应用程序。当我尝试将一些数据从视图传递到控制器操作时遇到了一个小问题。

这是我的模型:

public class TicketIndexModel
{
    public IEnumerable<Ticket> ticketList { get; set; }
    public Ticket newTicket { get; set; }

}

这是我的控制器操作:

public ActionResult AddTicket(Ticket ticket)
    {
        string user = User.Identity.Name;
        TicketDetail ticketDetails = new TicketDetail();

        if (ModelState.IsValid)
        {
            ticket.DateCreated = DateTime.Now;
            ticket.Status = "submitted";
            ticket.UserName = user;
            db.Tickets.Add(ticket);
            db.SaveChanges();

         //some other stuff



            return RedirectToAction("Index");
        }

在视图中,首先我显示所有票,然后我有一个小表单来添加新票。这就是表单的样子。

@using (Html.BeginForm("AddTicket","Ticket",FormMethod.Post)) {

    <div class="editor-label">
        @Html.LabelFor(model => model.newTicket.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.newTicket.Title)
        @Html.ValidationMessageFor(model => model.newTicket.Title)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.newTicket.Description)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.newTicket.Description, new { rows= "8",cols="2"})
        @Html.ValidationMessageFor(model => model.newTicket.Description)
    </div>

      <p>
        <input type="submit" value="Submit" />
    </p>

}

我面临的问题是,当我尝试添加新票时,票证参数始终为空,因此 If(ModelState.Isvalid)

有人知道为什么吗?

稍后编辑:

我的模型现在是:

public IPagedList<Ticket> ticketList { get; set; }

    //[Required(ErrorMessage ="Title required")]
    [Display(Name = "Title")]
    public string TicketTitle { get; set; }

    //[Required(ErrorMessage="Description Required")]
    [Display(Name = "Description")]
    public string TicketDescription { get; set; }

我现在的方法是:

    [HttpPost]
    public ActionResult AddTicket(TicketIndexModel newTicket)
    {
        string user = User.Identity.Name;     

        Ticket ticket = new Ticket();

        if (ModelState.IsValid)
        {
            ticket.Title = newTicket.TicketTitle;
            ticket.Description = newTicket.TicketDescription;
            ticket.DateCreated = DateTime.Now;
            ticket.Status = "open";
            ticket.UserName = user;
            db.Tickets.Add(ticket);
            db.SaveChanges();

我现在遇到的问题如下:

如果在模型中,我注释[必填]我可以添加一张票,如果没有,在控制器中,每次我提交新票时签名中的newTicket为空。但是,控制器输入 if(ModelState.IsValid) 并且我在 db.SaveChanges(ticket) 处收到错误。

我需要服务器端和客户端验证。你能帮帮我吗?

【问题讨论】:

  • 您的AddTicket 操作不应该有TicketIndexModel 参数而不是Ticket?
  • 我只使用票时为什么要使用 TicketIndexModel ?
  • 在浏览器中调查你的 http POST 请求的值,就像在 chrome 的 web 开发者栏中一样。然后将您发送的值与 Ticket 类的属性进行比较。他们看起来怎么样?
  • 检查一下你的最新错误:stackoverflow.com/questions/5400530/…

标签: asp.net-mvc


【解决方案1】:

您的 AddTicket 方法应如下所示

[HttpPost]
public ActionResult AddTicket(TicketIndexModel ticketIndexModel)

然后从传入的对象访问newTicket。

【讨论】:

  • 不确定能否解决。首先,HttpPost 是一个可选过滤器——这里的请求是在 post 方法中到达的,所以这个属性不会改变所要求的问题。其次,问题是关于添加 Ticket,TicketIndexModel 在 newTicket 旁边保存 Ticket 集合,这对我来说也不明显。所以我假设控制器的签名是好的。
  • @citykid 期望AddTicket Action 的参数是TicketIndexModel 是合乎逻辑的,因为在他看来,他正在访问model.newTicket 和newTicket 是在TicketIndexModel 上定义的。
  • 虽然新工单在索引模型中也让我感到惊讶,但将工单集合传递给控制器​​以创建新项目完全没有意义。
  • 我使用了一个断点,新参数有我给它的引入值,但是在这一行 db.Tickets.Add(newTicket); newTicket 的标题和描述再次为空。
  • 像 Mohammad 建议的那样,我从视图代码中假设视图的模型是 TicketIndexModel。我同意也许 TicketIndexModel 不适合这个目的,而不是有一个带有集合和单个对象的模型,最好将它们分开,并有一个视图谁的模型是 IEnumerable,目的其中只是列出门票,然后是带有门票模型的单独视图,允许用户添加新门票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多