从强类型视图将查询参数传递回控制器

时间:2011-09-06 19:49:03

标签: c# asp.net asp.net-mvc asp.net-mvc-3

也许我正在努力做到这一点,但是......

我有一个强类型的视图(一个注册页面),它工作得很好但是用户使用通过电子邮件发送给他们的链接到达视图,并且此URL中有一些我需要使用的查询字符串参数提交登记表时。

我可以在加载页面时在控制器中捕获这些参数并将它们填入“视图包”等等,但我无法弄清楚如何在表格中将它们交还给控制器提交。控制器方法的唯一参数是“类型”的实例,我甚至尝试扩展此类型以保存其他参数但是当我尝试在视图中分配它们时,没有对象的实例(I猜测这会在POST期间被实例化,这可以解释为什么在呈现页面时它不可用。

简而言之,我正在寻找一种方法来保持查询字符串中的某些值,并在提交强类型视图期间在控制器中访问这些值,如果可能的话。

5 个答案:

答案 0 :(得分:3)

将您需要的所有参数添加到input中的隐藏form标记中。这将使这些值返回到控制器操作。

答案 1 :(得分:2)

带有参数的URL链接到GET操作,对吗?如果是这样,请将参数名称作为变量添加到该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 controller动作中:

[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();
}

答案 2 :(得分:0)

如果要将它们与模型分开,可以在视图中添加适当命名的隐藏字段,并将这些字段作为参数添加到post函数中。

或者,您应该能够将这些添加到模型中,只要您在路上正确指定值,就可以将它们退出。

答案 3 :(得分: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
    ...
}

答案 4 :(得分:0)

您需要使用隐藏字段将参数从URL转移到View到Controller。例如,如果您在模型中说了一个ID参数,您需要将该参数传递给控制器​​,则应在视图中的“注册”表单中包含以下内容。

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

这样,当您的表单回发后,您的模型也将填充ID属性。