如何传递值 - 控制器到控制器?

时间:2014-03-13 12:54:48

标签: asp.net-mvc

我正在使用MVC并希望将值,控制器传递给控制器​​

我的代码:

public ActionResult Index()
{
    List<string> SportsName = new List<string>();
    var sport = Db.Universities.Where(ud => ud.Contact.UserName.ToLower().Trim() == User.Identity.Name.ToLower().Trim()).SingleOrDefault();
    var spt = Db.Departments.Where(i => i.UniversityID == sport.UniversityID && i.DepartmentCodeID == 4).SingleOrDefault();
    unvId = int.Parse(sport.UniversityID.ToString());
    List<Sport> dept = Db.Sports.Where(s => s.DepartmentID == spt.DepartmentID).ToList();

    foreach (var sname in dept.ToList())
    {
        var name = Db.SportsCodes.Where(s => s.SportsCodeID == sname.SportsCodeID).First();
        SportsName.Add(name.SportsName);
    }
    ViewBag.SportsName = SportsName;
    return View();
}

public ActionResult Create(string sports)
{
    ViewBag.SportsName = sports;
    int s = unvId;
    return View();
}

我想要&#39; sport&#39;创造行动的价值也。如何获得&#39; sport&#39;在创建动作?

2 个答案:

答案 0 :(得分:0)

我猜你的问题是你想将SportsName从Index传递给Create。

从索引视图(.cshtml)中通过AJAX调用调用创建方法时,将 ViewBag.Sports 的值作为参数传递。

例如:

$('#Link').click(function () {      
    $.ajax({
        url: http://localhost/Sports/Create,
        type: 'GET',
        data: { 
                sports: "@ViewBag.SportsName" 
              },
        success: function () {
        },
        error: function () {                
        }
    });

[注意:此处认为您的控制器名称为运动]

This回答您的问题。

答案 1 :(得分:0)

您有很多选择。如果只有单个操作方法需要该值,请在需要它的每个操作方法中获取值:

public ActionResult SomeMethod()
{
    var sport = Db.Universities.Where(ud => ud.Contact.UserName.ToLower().Trim() == User.Identity.Name.ToLower().Trim()).SingleOrDefault();
    // ...
}

如果重复的代码看起来不雅观,请将其抽象为辅助方法:

public ActionResult SomeMethod()
{
    var sport = GetSport();
    // ...
}

private SomeType GetSport()
{
    return Db.Universities.Where(ud => ud.Contact.UserName.ToLower().Trim() == User.Identity.Name.ToLower().Trim()).SingleOrDefault();
}

如果它应该可以在类中的任何地方访问,并且在逻辑上是类级成员,那么使它成为类级成员:

private SomeType sport = Db.Universities.Where(ud => ud.Contact.UserName.ToLower().Trim() == User.Identity.Name.ToLower().Trim()).SingleOrDefault();

public ActionResult SomeMethod()
{
    // sport is accessible here
    // ...
}

虽然现在我注意到了,但这引出了一个问题&#34;什么是Db&#34;?如果这是一个数据库上下文,那么看起来你已经扩展了它的范围,超出了它真正应该的范围。数据库上下文和连接应保持在尽可能小的范围内。每个需要的方法都应该创建,使用它并销毁它。在没有明确知道您正在做什么的情况下在更大的范围内共享它们会引发一系列问题。在这种情况下,类级成员将在构造函数中初始化:

private SomeType sport;

public YourController()
{
    using (var Db = BuildYourDBContext())
        sport = Db.Universities.Where(ud => ud.Contact.UserName.ToLower().Trim() == User.Identity.Name.ToLower().Trim()).SingleOrDefault();
}

public ActionResult SomeMethod()
{
    // sport is accessible here
    // ...
}

你看它的任何方式,重点是作为一个控制器并没有真正有所作为。控制器是一个对象,就像面向对象系统中的任何对象一样。它以完全相同的方式分享成员。