2010-10-27 66 views
1

我有一個名爲Associations的視圖,它有一個下拉列表和一個按鈕。當用戶選擇一個選項並按提交時,我希望他們去Association/{associationKey}。協會需要在獲取和發佈工作。簡單的MVC表單發佈和網址路由問題....我希望

目前,使用下面的代碼,當表單發佈時,它會轉到關聯並顯示正確的記錄,但它不會將associationKey附加到url。

所以我得到:替代

http://localhost/Association

http://localhost/Association/202

如果我手動導航到http://localhost/Association/202一切完美,所以GET和POST兩種工作很好.. .. 我只是想在一個帖子後的URL中的關鍵!

當然,必須有超級簡單的東西,我做錯了。下面的相關代碼。

謝謝!

社團查看:

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %> 
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%> 
<input type="submit" value="Edit The Selected Record" /> 
<% Html.EndForm(); %> 

職工控制器:


     [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
     public ActionResult Association(int associationKey) 
     { 
      return View("Association", new AssociationViewModel(associationKey)); 
     } 

global.asax中:


     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute("Default", "{action}", new { controller = "Staff", action = "Default" }); 
      routes.MapRoute("Associations", "Associations", new { controller = "Staff", action = "Associations" }); 
      routes.MapRoute("Association", "Association/{associationKey}", new { controller = "Staff", action = "Association" }); 
     } 

ASSOCIATION視圖模型:


    public class AssociationViewModel 
    { 

     public Repository db = new Repository(); 

     public Association Association {get; private set; } 

     public List TelephoneTypes { get; private set; } 

     public AssociationViewModel(int associationKey) 
     { 
      Association = db.AssociationById(associationKey); 
      TelephoneTypes = db.ListTelephoneTypes().ToList(); 
     } 

    } 

回答

2

我想你應該你的控制器動作分離出來,成爲一個付諸行動的形式提交,並把它變成一個GET和POST操作,像這樣:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Association(int associationKey) 
{ 
    return View("Association", new AssociationViewModel(associationKey)); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Association(AssociationViewModel model) 
{ 
    return RedirectToAction("Association", new {associationKey= model.associationKey}); 
} 

MVC框架會自動將選擇列表中的選定值綁定到模型(假設您在模型中有一個屬性來保存選定的值)。從那裏你只需要重定向到傳遞密鑰的GET方法。

+0

關聯視圖正從關聯視圖發佈到所以沒有關聯視圖傳遞給關聯視圖。我唯一擁有的是associationKey。 – Blackcoil 2010-10-27 18:12:16

+0

通過分裂爲兩個控制器動作,並讓您的POST動作接收到一個AssociationViewModel參數,框架將爲您實例化並綁定模型並將其傳遞給動作方法。嘗試一下,並把一個斷點,看看你得到什麼。只要確保先將一個空構造函數添加到AssociationViewModel類中。 – 2010-10-27 19:22:39

+0

解決方案是雙重的。首先,我像你所建議的那樣分割成GET和POST動作,並將FormCollection傳遞給POST,因爲associationKey在那裏。另外,我的路線錯誤順序。默認路線是最後一個,具體路線最先。 – Blackcoil 2010-10-27 21:24:39

1

它正在做一個帖子,而不是一個GET。這會將表單參數中的值放入url中。你可能想攔截使用JavaScript使用location=..

<script type="text/javascript"> 
    $(function() { // requires jQuery 
     $('form').submit(function() { 
      // maybe do some validation to ensure a legal value chosen first? 
      location.href = $(this).attr('action') + '/' + $(this).find('select').value(); 
      return false; // cancel submit 
     }); 
    }); 
</script> 

<% Html.BeginForm("Association", "Staff", FormMethod.Post); %> 
<%:Html.DropDownList("associationKey", new SelectList(Model.Associations.ToList(), "AssociationKey", "LegalName"))%> 
<input type="submit" value="Edit The Selected Record" /> 
<% Html.EndForm(); %>