ASP.NET MVC 5 - 具有自定义类型的重定向到操作传递空对象



>我有一个我不明白的情况。我正在开发一个小型Web应用程序,它模拟台球游戏过程。我有两个操作,第一个是负责收集用户输入的操作,第二个是计算必要的数据:

[HttpPost]
public ActionResult UserInput(UserInputViewModel inputParameters)
{
if (!ModelState.IsValid)
{
return View();
}
return RedirectToAction("Play", new { inputParameters });
}
public ActionResult Play(UserInputViewModel playParameters)
{  
PoolTableConfig config = CreatePoolTableConfig(playParameters);
PoolTable poolTable = new PoolTable(config);
PocketName resultPocketName = poolTable.Play();
IEnumerable<Point> crossPoints = poolTable.CrossPoints;
ViewBag.ResultPocketName = resultPocketName;
ViewBag.CrossPoints = crossPoints;
return View();
}
private PoolTableConfig CreateConfig(UserInputViewModel input)
{
return new PoolTableConfig()
{
Width = input.Width,
Height = input.Height,
BallPointX = input.BallPointX,
BallPointY = input.BallPointY,
VectorX = input.VectorX,
VectorY = input.VectorY
};
}

UserInputViewModel看起来像这样:

public class UserInputViewModel
{

[Required(ErrorMessage = "Please specify width.")]
[ProperWidth(ErrorMessage = "Width must be an even number.")]
[Range(300, 700)]
public uint Width { get; set; }
[Required(ErrorMessage = "Please specify height.")]
[Range(150, 500)]
public uint Height { get; set; }
[Required(ErrorMessage = "Please specify ball position X.")]
[Display(Name = "Ball position X")]
[ProperBallPosition("Width", ErrorMessage = "Ball position X cannot be equal or higher than pool table width.")]
public uint BallPointX { get; set; }
[Required(ErrorMessage = "Please specify ball position Y.")]
[Display(Name = "Ball position Y")]
[ProperBallPosition("Height", ErrorMessage = "Ball position Y cannot be equal or higher than pool table width.")]
public uint BallPointY { get; set; }
[Required(ErrorMessage = "Please specify vector X.")]
[Display(Name = "Vector X value")]
[Range(-1000, 1000)]
public int VectorX { get; set; }
[Required(ErrorMessage = "Please specify vector Y.")]
[Display(Name = "Vector Y value")]
[Range(-1000, 1000)]
public int VectorY { get; set; }
}

如您所见,我正在将自定义类型(视图模型(从UserInput()操作传递到Play()操作。操作UserInput()中的inputParameter变量具有正确的值,但是当程序转到Play()操作时,它为 null 或空(对象中包含类型的默认值(。

据我了解,默认 ASP.NET 模型绑定会验证自定义对象需要哪些属性,并在从客户端发送的 http 标头中搜索它们。我坚持使用标准的 ASP.NET 验证架构,所以我不明白为什么我的应用程序在将 http 标头参数转换为 .NET 对象时出现问题。当我用预定义类型(即字符串(替换自定义类型时,一切都是应该的。

我的问题是:为什么ASP在这种情况下无法从http标头生成正确的对象?

也许尝试这样的事情

return RedirectToAction("Play", "ControllerName", inputParameters);

另外,您不能只在UserInput ActionResult内进行Play完成的计算,然后返回您将在Play ActionResult中返回的任何视图吗?

[HttpPost]
public ActionResult UserInput(UserInputViewModel inputParameters)
{
if (!ModelState.IsValid)return View();
PocketName resultPocketName;
IEnumerable<Point> crossPoints;
PoolTable poolTable = new PoolTable((int)inputParameters.Width, (int)inputParameters.Height, (int)inputParameters.BallPointX, (int)inputParameters.BallPointY, inputParameters.VectorX, inputParameters.VectorY);
resultPocketName = poolTable.Play();
crossPoints = poolTable.CrossPoints;
ViewBag.ResultPocketName = resultPocketName;
ViewBag.CrossPoints = crossPoints;
return View("ViewName", whatEverModelYouNeed);
}

谢谢你们的帮助,但我自己:)找到了最令人满意的答案。我使用了 RouteValueDictionary((。UserInput(( 操作应如下所示:

[HttpPost]
public ActionResult UserInput(UserInputViewModel inputParameters)
{
if (!ModelState.IsValid)
{
return View();
}
return RedirectToAction("Play", "Home" , new RouteValueDictionary(inputParameters));
}

使用:

return Play(inputParameters);

而不是

return RedirectToAction("Play", new { inputParameters });

--编辑

很高兴知道您不能将对象传递给GET方法,也不能使用POST,因为RedirectToAction向浏览器返回302,这意味着浏览器将发出GET请求!

我上面写的解决方案可以解决问题,但它很笨拙,不推荐:)

如果要发出重定向命令并传递数据,则将使用 TempData。这篇文章比我没有抄袭的情况下更好地分解了它 在重定向到操作中传递对象

相关内容

  • 没有找到相关文章

最新更新