2011-06-20 56 views
0

我正在研究我的「第一」MVC 3應用程序,並被以下問題困擾。基本上我有一個聯繫表單,收集輸入並保存到數據庫。在列出所有聯繫人提交的頁面上,我希望用戶(將來將成爲管理員角色)能夠從聯繫人列表頁面中選擇單個聯繫人,然後單擊「Make Client」調用我的ClientController並將此聯繫人轉換爲一個客戶。 ClientController頁面也有一個Create()方法來從頭開始輸入一個新的客戶端記錄,所以爲了避免該方法的複雜性,我試圖創建一個接受contactID作爲參數的「Make」操作。重寫Create()ActionResult?

我的聯繫人列表頁面上下面的代碼:

@Html.ActionLink("Make Client", "Make", "Client", new { id = item.ID }, null) 

隨着客戶機控制器顯示爲這樣:

[HttpGet] 
    public ActionResult Create() 
    { 
     return View(new Client()); 
    } 

    // 
    // GET: /Make 
    // used for converting a Contact record into a Client 
    [HttpGet] 
    public ActionResult Make(int contactID) 
    { 
     try 
     { 
      var contactModel = _db.Contacts.Single(r => r.ID == contactID); 

      var clientModel = new Client() 
      { 
       FirstName = contactModel.FirstName, 
       LastName = contactModel.LastName, 
       <snip> . . . , 
       ZipCode = contactModel.ZipCode 
      }; 

      return View(new Client(clientModel)); 
     } 
     catch (Exception ex) 
     { 

      base.ViewData["Exception"] = "Exception: " + ex.InnerException.ToString(); 
      throw; 
     } 
    } 

的問題是,使用ContactID在對收到的(INT的ContactID)始終爲空。我已經能夠調整一些東西,得到以下工作通過調用標準創建一個可空的int參數()的ActionResult,但這種感覺做作:

[HttpGet] 
    public ActionResult Create(int? id) 
    { 
     if (id == null) 
     { 
      return View(new Client()); 
     } 
     else 
     { 
      return (Make(id)); 
     } 
    } 

底線是,我可以把這個創建()ActionResult參數不爲null,但是當我直接調用Make()時,參數不會傳遞。有什麼特別的Create()使這項工作?

謝謝,我也願意接受其他的選擇。

回答

3

Make動作的動作參數被稱爲contactID,所以生成的鏈接時,這個動作使用這個名字:

@Html.ActionLink(
    "Make Client", 
    "Make", 
    "Client", 
    new { contactid = item.ID }, 
    null 
) 

調用Make行動時,這將成功地傳遞正確的值作爲參數。因此,您不再需要在Create操作中調整調整

+0

Doh!謝謝,那就是訣竅。我想我並沒有意識到參數傳遞是如此直接與名稱相關。我還需要更改返回來調用創建視圖,現在正確地使用聯繫人的默認值填充。返回查看(「創建」,新客戶端(clientModel)); – djmarquette

+0

猜猜我需要弄清楚如何正確格式化評論。 return View("Create",new Client(clientModel)); djmarquette

+0

最後的評論 - 和更好的解決方案。我剛剛更改了預期現在具有Make(int id)的參數名稱。現在url是Client/Make/2而不是contactID = 2 – djmarquette