2017-02-10 23 views
0

我在我的应用程序中有两个屏幕。在第一种情况下,用户使用TempData对象选择两个传入下一个控制器的值(我们无法使用Session对象)。如何在页面刷新中获取控制器模型

然后在我的第二页的控制器中,它读取这些值并将它们分配给一个新模型。除非用户刷新页面,否则这完全可以正常工作。在这种情况下,TempData变量将丢失,并且我的模型不再包含这些值。

第一控制器的动作(当你从选择列表中选择第二项)

[HttpPost] 
public ActionResult Select(ProductSelector model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ProductSelector newModel = InitialiseProductSelectorModel(); 
     newModel.ProductId = model.ProductId; 
     newModel.StatusId = model.StatusId; 
     return View("ProductSelector", newModel); 
    } 
    TempData["StatusId"] = model.StatusId; 
    TempData["ProductId"] = model.ProductId; 
    return RedirectToAction("Create", "ProductDetails"); 
} 

我的第二个控制器的动作看起来是这样的:

[HttpGet] 
public ActionResult Create() 
{ 
    int ProductId, StatusId; 
    // Get ProductId and StatusId from product selector screen 
    int.TryParse(TempData["ProductId"].ToString(), out ProductId); 
    int.TryParse(TempData["StatusId"].ToString(), out StatusId); 
    model.ProductId = ProductId; 
    model.StatusId= StatusId; 

    return View("OrderCreate", model); 
} 

我怎样才能解决这个问题?我有另一个将模型作为参数的操作,但这是针对POST方法的。

+0

恐怕您完全不了解MVC模式如何工作以及信息如何传递。首先,阅读更多关于模型绑定的内容。然后看看TempData(http://stackoverflow.com/questions/2642062/asp-net-mvc-does-browser-refresh-make-tempdata-useless) –

+0

您能否详细说明一下?我可以看到将数据从一个控制器传递到另一个控制器的唯一方法是使用会话或tempdata,或将它传递给查询字符串。如果它全部在同一个控制器中,那么我将使用'return View()' – mikeyq6

+0

不,您使用模型绑定传递数据。这是传递信息的MVC方式,只是搜索它。 –

回答

0

尝试这种方式来传递参数

return RedirectToAction("Create", "ProductDetails", 
       new { StatusId = StatusId , ProductId = ProductId }); 

和下一步的行动得到这些值

public ActionResult Create(int StatusId, int ProductId) 

编辑::另一种方法(不查询字符串):

在你create在从TempData取回数据之前执行此操作

[HttpGet] 
public ActionResult Create() 
{ 
    int ProductId, StatusId; 

    TempData.Keep("ProductId"); // These two lines will keep data 
    TempData.Keep("StatusId"); // upon multiple refreshes 

    int.TryParse(TempData["ProductId"].ToString(), out ProductId); 
    int.TryParse(TempData["StatusId"].ToString(), out StatusId); 
    model.ProductId = ProductId; 
    model.StatusId= StatusId; 

    return View("OrderCreate", model); 
} 
+0

这样可以,除非我无法通过查询字符串传递数据。 – mikeyq6

+0

@ mikeyq6这*不是*在查询字符串中传递数据。它添加了这些路由参数。如果您的路由被定义为它没有定义这些参数,它会将它们添加到查询字符串中。所以,用参数定义你的路线。 – Amy

+0

但在这两种情况下,数据都通过网址传递。如果您定义了路线,那么这意味着它们不是键/值对。在上面的例子中,这意味着'/ ProductDetails/Create/1/2'和'/ ProductDetails/Create/1 /?ProductId = 2'之间的区别。无论哪种情况,参数仍然在URL – mikeyq6

相关问题