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

C# 从强类型视图将查询参数传递回控制器,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,也许我让事情变得更难了,但是 我有一个强类型视图(注册页面),它工作得很好,但是用户使用通过电子邮件发送给他们的链接到达视图,并且这个URL中有一些查询字符串参数,我需要在提交注册表单时使用这些参数 当页面加载时,我能够在控制器中捕获这些参数,并将它们塞进“查看包”等等,但我不知道在提交表单时如何将它们交还给控制器。控制器方法的唯一参数是“type”的实例,我甚至尝试扩展该类型以保存其他参数,但当我尝试在视图中分配这些参数时,没有对象的实例(我猜这是在POST期间实例化的,这将解释为什么在呈现页

也许我让事情变得更难了,但是

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

当页面加载时,我能够在控制器中捕获这些参数,并将它们塞进“查看包”等等,但我不知道在提交表单时如何将它们交还给控制器。控制器方法的唯一参数是“type”的实例,我甚至尝试扩展该类型以保存其他参数,但当我尝试在视图中分配这些参数时,没有对象的实例(我猜这是在POST期间实例化的,这将解释为什么在呈现页面时它不可用)


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

将所有需要的参数添加到
表单中的隐藏
输入
标记中。这将使这些值发回控制器操作。

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

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


或者,您应该能够将这些字段添加到模型中,并让它们返回,只要您在输入的过程中正确分配了值。

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


或者,您应该能够将它们添加到模型中,并让它们返回,只要您在输入的过程中正确分配值。

您可以将它们作为命名参数添加到控制器操作中,或者使用通用的
FormCollection
,它将包含所有表单值

或者,只需将它们添加到模型类中,例如,
RegisterModel
,它们将在模型绑定期间按名称匹配

要将它们与页面模型分开,请使用以下任一选项:

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


您可以将它们作为命名参数添加到控制器操作中,或者使用通用的
FormCollection
,它将包含所有表单值

或者,只需将它们添加到模型类中,例如,
RegisterModel
,它们将在模型绑定期间按名称匹配

要将它们与页面模型分开,请使用以下任一选项:

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


带参数的URL链接到GET操作,对吗?如果是,将参数名称作为变量添加到该操作的声明中。例如,假设我通过电子邮件发送的URL是:

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中:

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

带参数的URL链接到GET操作,对吗?如果是,将参数名称作为变量添加到该操作的声明中。例如,假设我通过电子邮件发送的URL是:

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中:

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

您需要使用隐藏字段将参数从URL传递到视图和控制器。例如,如果您的模型中有一个
ID
参数,您需要将该参数传递给控制器,那么您应该在视图中的注册表中包含以下内容

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

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

您需要使用隐藏字段将参数从URL传递到视图到控制器。例如,如果您的模型中有一个
ID
参数,您需要将该参数传递给控制器,那么您应该在视图中的注册表中包含以下内容

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

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

我尝试了这种方法,但我不确定如何从控制器端获取它们,你能给我指出正确的方向或提供一个例子吗?我尝试了这个方法,但我不确定如何从控制器端着手,你能给我指出正确的方向或提供一个例子吗?关键是查询字符串是在URL中编码的。如果您没有导航到远离URL(例如,通过重定向或在JS中设置URL),浏览器将在该URL上“保持不变”。因此,要“保留”查询字符串参数,直到您在同一页面(URL)上发布为止,您不必做任何特殊的事情!关于如何访问这些查询字符串参数,已经有很多很好的答案,这同样适用于初始GET和以下POST操作。如果您没有导航到远离URL(例如,通过重定向或在JS中设置URL),浏览器将在该URL上“保持不变”。因此,要“保留”查询字符串参数,直到您在同一页面(URL)上发布为止,您不必做任何特殊的事情!关于如何访问这些查询字符串参数,已经有很多很好的答案