2013-04-16 193 views
2

我開始使用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> 

} 

我面臨的問題是,當我嘗試添加一個新的機票,車票參數始終是空的,所以如果(ModelState.Isvalid)< - 永遠是假的,所以我不能添加新門票DB。

有沒有人有任何想法爲什麼?

後來編輯

我的模型現在是:現在

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(); 

的問題,我現在是這樣的:

如果在模型中,我評論[必填]我可以添加icket,如果沒有,在控制器中,每次我提交一張新票時簽名中的newTicket都是空的。但是,控制器輸入if(ModelState.IsValid),並在db.SaveChanges(票證)上發生錯誤。

我需要服務器端和客戶端驗證。你可以幫我嗎 ?

+2

你的'AddTicket'行爲不應該有'TicketIndexModel'參數而不是'Ticket'嗎? –

+0

爲什麼在我僅使用票證時使用TicketIndexModel? –

+0

在瀏覽器中調查您的http POST請求的值,就像在Chrome開發人員欄中一樣。然後將您發送的值與Ticket類的屬性進行比較。他們看起來如何? – citykid

回答

2

你AddTicket方法應該是這樣的

[HttpPost] 
public ActionResult AddTicket(TicketIndexModel ticketIndexModel) 

然後訪問newTicket從傳遞給它的對象。

+0

不確定解決它。首先,HttpPost是一個可選的過濾器 - 這裏的請求到達post方法,所以這個屬性不會改變所要求的問題。其次,問題是關於添加Ticket,TicketIndexModel在新門票旁邊保存門票集合,這對我來說也不明顯。所以我認爲控制器的簽名是可以的。 – citykid

+0

@citykid在'TicketIndexModel'中定義'AddTicket' Action的參數是一個'TicketIndexModel',因爲在他看來,他正在訪問'model.newTicket'和'newTicket'。 –

+0

儘管新票在索引模型中也令我感到驚訝,但將票收集傳遞給控制器​​以創建新物品是沒有意義的。 – citykid

相關問題