2011-09-06 94 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属性。