2009-01-16 19 views
0

好吧,所以,我完全是新的MVC,我試圖圍繞我的頭幾個概念。我已經創建了一個小應用程序...ASP.NET MVC標準鏈接/ Href作爲保存按鈕和模型IS NUll

此應用程序有創建新的個人記錄的視圖。該視圖綁定到一個模型的ViewPage ...我有一個相關的IndividualController具有方法...

的IndividualController的方法看起來像這樣...

public ActionResult New() 
    { 
     var i = new Individual(); 

     this.Title = "Create new individual..."; 
     i.Id = Guid.NewGuid(); 

     this.ViewData.Model = new Individual(); 


     return View(); 
    } 

現在,上述所有似乎工作。加載視圖時,我可以從單個對象中檢索數據。問題進場時,我嘗試將數據保存回通過控制器...

在我IndividualController我也有一個保存方法,它接受類型個人的傳入參數。該方法看起來像......

public ActionResult Save(IndividualService.Individual Individual) 
    { 
     return RedirectToAction("New"); 
    } 

現在,我的看法,我想用一個標準的HTML鏈接/ HREF被用作「保存」按鈕,所以我定義的ActionLink的是這樣的...

<%=Html.ActionLink("Save", "Save") %> 

此外,我認爲定義我已經創建了一個單一的文本框所以舉辦的第一個名字像這樣的測試...

<% using (Html.BeginForm()) { %> 
    <%=Html.TextBox("FirstName", ViewData.Model.FirstName)%> 
<% } %> 

,如果我把一個破發點中保存方法一d點擊我的視圖中的「保存」鏈接,在我的控制器中點擊斷點。問題是Save方法的輸入參數爲空;即使我輸入一個值到名字文本框中...

很明顯,我正在做一些完全錯誤的事情。有人可以把我直...提前

謝謝...

回答

1

你的新控制器的方法並不需要創建一個單獨的,你可能只是想它來設置標題和返回認爲,儘管你可能需要做一些授權處理。下面是我的一個項目爲例:

[AcceptVerbs(HttpVerbs.Get)] 
    [Authorization(Roles = "SuperUser, EditEvent, EditMasterEvent")] 
    public ActionResult New() 
    { 
     ViewData["Title"] = "New Event"; 
     if (this.IsMasterEditAllowed()) 
     { 
      ViewData["ShowNewMaster"] = "true"; 
     } 

     return View(); 
    } 

您保存的行動應該從表單輸入,並創建一個新的模型的實例,堅持它。我的例子比我想在這裏發佈的要複雜一點,所以我會盡量簡化它。請注意,我正在使用FormCollection而不是使用模型綁定,但您也應該能夠使其工作。

[AcceptVerbs(HttpVerbs.Post)] 
    [Authorization(Roles = "SuperUser, EditEvent, EditMasterEvent")] 
    public ActionResult Save(FormCollection form) 
    { 
     using (DataContext context = ...) 
     { 
       Event evt = new Event(); 
       if (!TryUpdateModel(evt, new [] { "EventName", "CategoryID", ... })) 
       { 
        this.ModelState.AddModelError("Could not update model..."); 
        return View("New"); // back to display errors... 
       } 
       context.InsertOnSubmit(evt); 
       context.SubmitChanges(); 
       return RedirectToAction("Show", "Event", new { id = evt.EventID }); 
     } 
    } 
0

如果我沒有創建新方法新Indvidual對象,然後當我認爲試圖將文本框綁定到關聯的模型我上線下方一個NullReferenceException在我看來......

`<%=Html.TextBox("FirstName", ViewData.Model.FirstName)%>` 

關於Save方法。據我瞭解,因爲我的看法是強類型我不應該能有一個方法簽名像...

`public ActionResult New(IndividualService.Individual ind) 
    { 
     return View(); 
    }` 

我認爲這是隱藏模型結合的目的..?

+0

傑森,你可以閱讀有關在SO中使用markdown的文檔。 http://stackoverflow.com/editing-help,你縮進代碼並用`分隔它。使用`嵌入正常段落文本中的關鍵字。對於代碼示例,您只需要縮進4個空格。 – AnthonyWJones 2009-01-16 20:38:46

0

我強烈建議你退一步從正在通過一些教程/這裏http://www.asp.net/learn/

影片的執行和運行什麼回來,如果你有一個強類型View這意味着當Controller選秀權是查看生成輸出該視圖有更好的訪問Model

然而View負責什麼來自客戶端隨後這樣當窗體發佈或URL以其他方式導航到腰傷。

ASP.NET-MVC使用URL中的信息來確定將請求交給哪個Controller。之後,控制者有責任將請求中的各種其他元素分解爲Model類的實例。

傳入請求和控制器之間的關係被ASP.NET MVC路由給控制器的重要幫助蒙上了陰影。例如,可以定義一個路由來爲控制器方法提供參數,並且這就是所有控制器所需要的,因此您在與http請求相關的方法中看不到任何代碼。然而應該理解,控制器方法是簡單地處理http請求的

我希望從上面可以看出,在模型的類實例傳遞給控制器​​上的公共方法的請求生命週期中,爲時尚早。它由控制器決定哪些模型類別是否需要實例化。