【问题标题】:MVC NET - Keep simple data between controllersMVC NET - 在控制器之间保留简单数据
【发布时间】:2016-07-01 17:14:54
【问题描述】:

我正在开发一个基于流行的 ContosoUniveristy 教程的简单项目。我想扩展本教程中的一些功能。

我创建了一个名为 School 的表,我在其中保存了每所学校的属性,例如地址、电话号码、课程、学生等。后来我在学生、课程和其他几个表中添加了一个名为 SchoolID 的 foreignKey 属性。

我有一个带有基本布局视图的 SchoolIndex 页面,其中列出了所有学校,用户可以单击一个进入详细信息页面。此详细信息页面有一个 _DitLayout 布局,左侧有附加菜单,您可以在其中找到指向适当信息的链接,例如联系人、课程、学生(例如存储在 School 表中的那些)。 _DitLayout 由所有联系人、课程和学生视图共享。

这里我有一个问题。当我在 SchoolIndex 页面上单击学校时,我希望左侧菜单中的链接指向这个特定的学校属性。为此,我必须以某种方式将 SchoolID 传递给布局页面(不是一个好主意?)。另一种方法是在运行槽视图、控制器和操作时以某种方式存储 SchoolID。这样我就可以在控制器中编写

  public class SchoolController : Controller
  {
     private SchoolContext db = new SchoolContext();

     public ActionResult Contact()
     {

        int ID  = //here I pass SchoolID;

        // I fetch school from the database
        SchoolModel school = db.School.Find(ID);

        //and I map the properties to the ViewModel
        ContactViewModel contact = new ContactViewModel();
        contact.Address = school.Address;
        contact.Phone = school.Phone;
        //etc.

        return View(contact);
     }
   }

问题是:如何在控制器之间传递或存储 SchoolID?是的,我不仅需要在动作之间传递 ID,还需要在控制器之间传递 ID。

我想也许我可以将这个 ID 存储在 cookie 中。这是个好主意吗?有更好的方法吗?

【问题讨论】:

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


    【解决方案1】:

    如果您想存储数据,而不是将其保存在 URL(或 HTTP 请求)中,那么您必须将其保存在 Session 或 Cookie 中。

    我个人会修改 MVC 路由以包含学校 ID。

    例如:/{schoolId}/{controller}/{action}.

    这样,无论控制器如何,schoolId 都可以在任何操作中使用。

    【讨论】:

    • 感谢 Nsevens。我会立即尝试您的解决方案。
    • Nsevens 我无法理解它。如果我有这样的 url 路由模式:“{schoolID}/{controller}/{action}/{id}”那么我应该如何在视图中编写我的控制器,例如 Html.ActionLink() 以使其工作?
    • @Arthur 你可以在控制器NewsController 中拥有一个动作方法public ActionResult All(int schoolID),而它又可以被动作链接@Html.ActionLink("View school news", "All", "News", new RouteValueDictionary(new { schoolID = <<YOUR_SCHOOL_ID>> })) 调用
    【解决方案2】:

    您可以使用 Session 对象或 TempData 在控制器之间传递数据。

    public class SchoolController : Controller
    {
        private SchoolContext db = new SchoolContext();
    
        public ActionResult Contact()
        {
            int ID  = TempData["SchoolID"];
    
            // I fetch school from the database
            SchoolModel school = db.School.Find(ID);
    
            //and I map the properties to the ViewModel
            ContactViewModel contact = new ContactViewModel();
            contact.Address = school.Address;
            contact.Phone = school.Phone;
            //etc.
    
            return View(contact);
        }
    }
    
    public class OtherController : Controller
    {
        public ActionResult School(int id)
        {
            TempData["SchoolID"] = id;
    
            return RedirectToAction("/School/Contact");
        }
    }
    

    【讨论】:

    • 谢谢宗介。我也有这个想法,但我读到 sesions 和 TempData 存在安全缺陷,所以我将其作为第二选择。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2017-05-21
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2023-03-23
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多