Model view controller MVC中传递值的最佳方法

Model view controller MVC中传递值的最佳方法,model-view-controller,asp.net-mvc-3,Model View Controller,Asp.net Mvc 3,我还是MVC的新手,如果这是一个明显的问题,我很抱歉: 我有一个页面,用户可以在其中选择几个项目之一。当他们选择一个时,他们会被带到另一个表格中填写详细信息 将该值传递到表单页面的最佳方式是什么? 我不希望第二个(表单)页面URL中的项目ID 因此,用户可以在/选择您的物品/到/赎回/中看到所选内容,并填写表单。将显示选定的项目,并以隐藏形式显示 我猜一个选项是在重定向之前存储在会话中,但我想知道是否还有其他选项 如果您不想在url中使用所选值,我将使用MVC3,您可以使用form POST。因

我还是MVC的新手,如果这是一个明显的问题,我很抱歉:

我有一个页面,用户可以在其中选择几个项目之一。当他们选择一个时,他们会被带到另一个表格中填写详细信息

将该值传递到表单页面的最佳方式是什么? 我不希望第二个(表单)页面URL中的项目ID

因此,用户可以在/选择您的物品//赎回/中看到所选内容,并填写表单。将显示选定的项目,并以隐藏形式显示

我猜一个选项是在重定向之前存储在会话中,但我想知道是否还有其他选项


如果您不想在url中使用所选值,我将使用MVC3,您可以使用form POST。因此,您可以发布到新页面,而不是重定向到新页面:

@using (Html.BeginForm("SomeAction", "SomeController"))
{
    @Html.DropDownListFor(...)
    <input type="submit" value="Go to details form" />
}
使用(Html.BeginForm(“SomeAction”、“SomeController”)) { @Html.DropDownListFor(…) }
如果不希望url中包含所选值,可以使用表单POST。因此,您可以发布到新页面,而不是重定向到新页面:

@using (Html.BeginForm("SomeAction", "SomeController"))
{
    @Html.DropDownListFor(...)
    <input type="submit" value="Go to details form" />
}
使用(Html.BeginForm(“SomeAction”、“SomeController”)) { @Html.DropDownListFor(…) }
如果在显示/redemption/页面之前不需要进行任何额外的处理,Darin Dimitrov的答案将是最好的。如果确实需要一些额外的处理,则必须使用
TempDataDictionary
在操作之间传递数据。存储在
TempDataDictionary
中的值只用于一个请求,该请求允许在操作之间传递数据,而存储在
ViewDataDictionary
中的值只能从操作传递到视图。下面是一个例子:

public ActionResult ChooseYourItem()
{
    return View();
}

[HttpPost]
public ActionResult ChooseYourItem(string chosenItem)
{
    TempData["ChosenItem"] = chosenItem;

    // Do some other stuff if you need to

    return RedirectToAction("Redemption");
}

public ActionResult Redemption()
{
    var chosenItem = TempData["ChosenItem"];

    return View(chosenItem);
}

如果在显示/redemption/页面之前不需要进行任何额外的处理,Darin Dimitrov的答案将是最好的。如果确实需要一些额外的处理,则必须使用
TempDataDictionary
在操作之间传递数据。存储在
TempDataDictionary
中的值只用于一个请求,该请求允许在操作之间传递数据,而存储在
ViewDataDictionary
中的值只能从操作传递到视图。下面是一个例子:

public ActionResult ChooseYourItem()
{
    return View();
}

[HttpPost]
public ActionResult ChooseYourItem(string chosenItem)
{
    TempData["ChosenItem"] = chosenItem;

    // Do some other stuff if you need to

    return RedirectToAction("Redemption");
}

public ActionResult Redemption()
{
    var chosenItem = TempData["ChosenItem"];

    return View(chosenItem);
}

为了帮助其他人,这就是我如何解决我的问题,需要多个按钮发回,并希望每次传递不同的Id

我在页面上有一个表单,它会发回给我的控制器:

表格:

        @using (Html.BeginForm("ChooseYourItem", "Item", FormMethod.Post))
        {
和代码

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChooseYourItem(string itemId)
    {
        TempData["ITEMID"] = itemId

        return RedirectToAction("Create", "Redemption");
    }
<strong>Item 1</strong>
<button value="123" name="itemid" id="btn1">Select</button>

<strong>Item 2</strong>
<button value="456" name="itemid" id="btn2">Select</button>
然后,在表单中,我创建了名称为“itemId”的按钮,但每次都有不同的值

例如

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChooseYourItem(string itemId)
    {
        TempData["ITEMID"] = itemId

        return RedirectToAction("Create", "Redemption");
    }
<strong>Item 1</strong>
<button value="123" name="itemid" id="btn1">Select</button>

<strong>Item 2</strong>
<button value="456" name="itemid" id="btn2">Select</button>
项目1
挑选
第2项
挑选

为了帮助他人,我就是这样解决了需要多个按钮发回的问题,每次都想传递不同的Id

我在页面上有一个表单,它会发回给我的控制器:

表格:

        @using (Html.BeginForm("ChooseYourItem", "Item", FormMethod.Post))
        {
和代码

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChooseYourItem(string itemId)
    {
        TempData["ITEMID"] = itemId

        return RedirectToAction("Create", "Redemption");
    }
<strong>Item 1</strong>
<button value="123" name="itemid" id="btn1">Select</button>

<strong>Item 2</strong>
<button value="456" name="itemid" id="btn2">Select</button>
然后,在表单中,我创建了名称为“itemId”的按钮,但每次都有不同的值

例如

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChooseYourItem(string itemId)
    {
        TempData["ITEMID"] = itemId

        return RedirectToAction("Create", "Redemption");
    }
<strong>Item 1</strong>
<button value="123" name="itemid" id="btn1">Select</button>

<strong>Item 2</strong>
<button value="456" name="itemid" id="btn2">Select</button>
项目1
挑选
第2项
挑选

谢谢。我尝试了一下,但当我进入我的赎回页面时,我的TempData值为空。我通过点击按钮调用jQuery的ActionResult?不确定这是不是正确/最好的方法?我无法在代码中执行重定向(它不起作用,而且我读到在AJAX post backs中忽略了重定向?),javascript中的window.transfer也是如此。我猜我的TempData值已过期?从页面调用我的ActionResult的最佳方式是什么?每个“项目”都是从按钮中选择的Thanks@xTRUMANx好的,我已经创建了我的行,如下所示:。在项目控制器中,我可以设置TempData值,然后执行重定向到我的赎回页面的操作。然后可在兑换页面上查看TempData值。所以,它是有效的,但我确实想确保我已经以最佳实践的方式做到了这一点?Cheers@mp3duck:最佳做法是使用点击按钮导航到赎回页面,并在应用HTTPPost的情况下执行操作。由于您是通过链接设置的,因此我假设您没有将HTTPPost属性应用于将值设置到TempDataDictionary中的方法,这不是标准做法。哦,如果你不介意的话,把这个作为一个答案,如果它对你有用的话。我不介意这个代表;)@xTRUEMANx感谢您提供此信息。。那么,我应该如何设置一个发布到ActionResult的按钮呢?就像我上面提到的,我每次都需要把项目ID发回?我每页都会有几个项目谢谢。我尝试了一下,但当我进入我的赎回页面时,我的TempData值为空。我通过点击按钮调用jQuery的ActionResult?不确定这是不是正确/最好的方法?我无法在代码中执行重定向(它不起作用,而且我读到在AJAX post backs中忽略了重定向?),javascript中的window.transfer也是如此。我猜我的TempData值已过期?从页面调用我的ActionResult的最佳方式是什么?每个“项目”都是从按钮中选择的Thanks@xTRUMANx好的,我已经创建了我的行,如下所示:。在项目控制器中,我可以设置TempData值,然后执行重定向到我的赎回页面的操作。然后可在兑换页面上查看TempData值。所以,它是有效的,但我确实想确保我已经以最佳实践的方式做到了这一点?Cheers@mp3duck:最佳做法是使用点击按钮导航到赎回页面,并在应用HTTPPost的情况下执行操作。由于您是通过链接设置的,所以我假设您没有将HTTPPost属性应用于将值设置到TempDataDictionary中的方法,而TempDataDictionary是我创建的