MVC控制器到控制器数据

时间:2014-05-05 14:39:46

标签: asp.net-mvc asp.net-mvc-4

MVC中是否有办法将信息从一个控制器传递到另一个控制器?我有一个如下所示的角色模型:

 public class Character
    {
        [Key]
        public string CharacterID { get; set; }
        public string UserID { get; set; }
        public string Name { get; set; }
        public int Str { get; set; }
        public int Con { get; set; }
        public int Dex { get; set; }
        public int Int { get; set; }
        public int Wis { get; set; }
        public int Cha { get; set; }
        public int BaseAttack { get; set; }
    }

还有一个像这样的武器模型:

 public class Weapons
    {
        [Key]
        public string WeaponID { get; set; }
        public string UserID { get; set; }
        public string CharacterID { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
        public string Range { get; set; }
        public int Damage { get; set; }
        public int Crit { get; set; }
        public int CritMultiplier { get; set; }
        public string Hands { get; set; }
        public string Distance { get; set; }
    }

要创建武器,首先需要创建一个分配了ID的角色,我希望能够将该ID传递给我的武器控制器的create方法。有没有办法做到这一点?感谢

3 个答案:

答案 0 :(得分:0)

我倾向于通过路由将字符id传递给创建武器操作,作为构成路径一部分的路由令牌或通过查询字符串。务必检查武器在逻辑上是否与id对应的角色相关联。

您也可以使用TempDataSession传递ID,但默认情况下两者都会占用网络服务器上的内存,简单的选择是使用路由。此外,除非您在访问TempData.Keep("key")后致电TempData,否则该值将在首次访问后从TempData移除,如果用户刷新浏览器窗口,可能会导致问题。

答案 1 :(得分:0)

您可以将TempData用于此目的。 TempData仅在两个请求之间存储数据。设置TempData时,下一个启动的请求可以从TempData中检索值,并且它将被删除以用于任何后续请求。

[HttPost]
public ActionResult CreateCharacter() 
{

  // creates charaeters here and sets the tempdata
  TempData['CharacterId'] = 50; 

  return RedirectToAction('CreateWeapon');
}

[HttpGet]
public ActionResult CreateWeapon() 
{
  var weaponModel = new WeaponModel() { CharacterId = (int)TempData['CharacterId'] };
  return View(weaponModel);
}

并且在您的视图中只有一个隐藏的CharacterId,因此如果您的帖子验证失败或者您需要重新显示视图,它将被保留。

@Html.HiddenFor(e => e.CharacterId);

这只是一种方法,只有你不想在网址中传递CharacterId。

你也可以通过在网址中传递它来实现这个目标:

[HttPost]
public ActionResult CreateCharacter() 
{

  // creates charaeters here and sets the tempdata

  return RedirectToAction('CreateWeapon', new { characterId = 50 });
}

[HttpGet]
public ActionResult CreateWeapon(int characterId) 
{
  var weaponModel = new WeaponModel() { CharacterId = characterId };
  return View(weaponModel);
}

答案 2 :(得分:0)

您可以使用RedirectToAction(),但标题是这将导致浏览器重定向。

return RedirectToAction("CreateWeapon", "Weapon", new { id = yourid });

@Html.ActionLink("CreateWeapon", "Create", new { id = yourid })

编辑:您的普通对象属性名称和操作方法变量需要匹配才能执行此操作。