2011-09-06 117 views
1

也許我做比它需要更加努力這樣傳遞查詢參數回控制器,但是......從強類型的視圖

我有一個強類型的視圖(一個註冊頁面),這但用戶使用通過電子郵件發送給他們的鏈接到達視圖,而且這個URL有幾個查詢字符串參數,我需要在提交註冊表單時使用這些參數。

我可以捕獲這些參數在控制器中,當頁面被加載並將它們填入「查看包」等,但我無法弄清楚如何將它們交給控制器時,表單已提交。控制器方法的唯一參數是「類型」的一個實例,我甚至試圖擴展這種類型來保存附加參數,但是當我嘗試在視圖中分配它們時,沒有該對象的實例(I猜測這會在POST期間得到實例化,這將解釋爲什麼它在頁面呈現時不可用)。

簡而言之,我正在尋找一種方法來保留查詢字符串中的某些值,並在提交強類型視圖期間訪問控制器中的這些值(如果甚至可以的話)。

+0

問題是查詢字符串是在URL中編碼的。如果您不從URL導航(例如,通過重定向或設置JS中的URL),瀏覽器將「保持放置」該URL。因此,要「保留」查詢字符串參數,直到您發佈在同一頁面(URL)上,您不必做任何特別的事情!關於如何訪問這些查詢字符串參數已經有很多很好的答案,並且對於初始GET和以下POST操作同樣適用。 –

回答

2

你的URL與參數鏈接到一個GET操作,對不對?如果是這樣,請將參數名稱作爲varaible添加到該Action的聲明中。因此,例如,說我的網址通過電子郵件發送的是:

http://mywebsite.com/register?id=511&sl=department 

然後我相應的行動是:

public ActionResult Register(int id, string sl) 
{ 
    MyModel myModel = new MyModel(); 
    myModel.id = id; 
    myModel.sl = sl; 
    return View(myModel); 
} 

爲了保持過程中多步驟的過程,你可以使用這些Html.HiddenFor()在視圖中添加隱藏字段或保存到其他位置(即數據庫)。


如果你不希望將其添加到您的模型,那麼你可以這樣做:

public ActionResult Register(int id, string sl) 
{ 
    ViewData["id"] = id; 
    ViewData["sl"] = sl; 
    return View(); 
} 

現在在視圖中有一個隱藏字段每個。然後在POST-to控制器操作中:

[HttpPost] 
public ActionResult Register(MyModel myModel, int id, string sl) 
{ 
    // the hidden fields are now in id and sl 
    // ASSUMPTION: the names of "id" and "sl" don't exist in MyModel -- if they do, collision 
    ... 
    return View(); 
} 
+0

這正是我所需要的。我開始通過擴展模型來包含通過querystring傳入的值,但是我錯過的是在將控制器交給視圖之前在控制器中實例化模型。很好的答案,謝謝! – jasongullickson

3

將您需要的所有參數添加到form中隱藏的input標記中。這將使這些值被POST回控制器操作。

+0

我試過這個,但是我不確定如何去從控制器端獲取它們,你能指出我在正確的方向還是提供一個例子嗎? – jasongullickson

0

如果您想讓它們與模型分開,您可以在視圖中添加適當命名的隱藏字段,並將它們作爲參數添加到後置函數中。

或者,你應該能夠添加這些到模型上,並讓他們回來,只要出你賦值上正確的方式。

0

可以作爲命名的參數將它們添加到您的控制器動作,或使用通用的FormCollection,它將具有所有表單值。

或者,只需將它們添加到您的模型類(例如RegisterModel)中,它們將在模型綁定過程中按名稱進行匹配。

爲了讓他們從你的頁面模型分開,使用:

protected ActionResult Register(RegisterModel model, string parameterName1, int parameterName2) 
{ 
    // parameterName1 and parameterName2 now contain values from the form with the same names 
    ... 
} 

OR

protected ActionResult Register(RegisterModel model, FormCollection fc) 
{ 
    // fc now contains all form values 
    ... 
} 
0

您需要使用隱藏字段來將參數從URL傳遞到控制器。例如,如果您要在模型中指定一個ID參數(需要傳遞給控制器​​)​​,則應在視圖的「註冊」表單中包含以下內容。

@Html.HiddenFor(m=>m.ID) 

這樣,當表單回傳時,您的模型也會填充ID屬性。