【问题标题】:ASP.NET MVC5 Display data to user with specific selected data"Branch"ASP.NET MVC5 使用特定选定数据“分支”向用户显示数据
【发布时间】:2018-07-12 15:56:20
【问题描述】:

我有下一列的表格

Id,Name,A_Status,BranchName.

使用我在下面描述的下一个方法是否会很容易实现? 列分支有 25 个不同的名称。所以,我想创建一个页面,有 25 个分支标题(并且为每个分支创建自己的 cshtml 页面),用户可以在其中输入和查看他选择的特定分支的数据。在每个页面的特定权限上,并非所有用户都可以输入和查看它们。 我决定用下一个代码来实现它。

我的控制器

public ActionResult A_Branch ()
        {
            string query = "SELECT BranchName,Name, MAX(A_STATUS) AS A_Status "
                    + "FROM Students "
                    + "WHERE BranchName= '1_Branch' "
                    + "GROUP BY BranchName,Name";
            IEnumerable<EnrollmentStudentGroup> data = db.Database.SqlQuery<EnrollmentStudentGroup>(query);

            return View(data.ToList());
        }

下一个 actionresult 我将创建 23 倍。

public ActionResult B_Branch ()
            {
                string query = "SELECT BranchName,Name, MAX(A_STATUS) AS A_Status "
                        + "FROM Students "
                        + "WHERE BranchName= '2_Branch' "
                        + "GROUP BY BranchName,Name";
                IEnumerable<EnrollmentStudentGroup> data = db.Database.SqlQuery<EnrollmentStudentGroup>(query);

                return View(data.ToList());
            }

我的 2 个模型;

public class Student : BaseEntity
    {
        public int Id { get; set; }           
        public string BranchName { get; set; }                         
        public string Name { get; set; }                    
        public int A_Status { get; set; }


    }
public class EnrollmentStudentGroup
    {

        public string BranchName { get; set; }

        public string Name { get; set; }

        public int A_Status { get; set; }


        public IEnumerable<EnrollmentStudentGroup> StudentCollection { get; set; }
    }

和我的模特

 public class Model
    {
        public List<Student> Students { get; set; }
        public List<EnrollmentStudentGroup> EnrollmentStudentGroup { get; set; }
    }

我最新的控制器(在“.select”之后他给了我错误)

   [HttpGet]
        public ActionResult TestNew(string branchname)
        {
            // check stuff like permissions
            var db = new MovieContext();
            var model = new Model();

            var students = db.Student
                .Where(x => x.BranchName == branchname)
                .GroupBy(x => new { x.BranchName, x.Name, x.Currency, x.NoCart, x.NoAccount })
                .Select(x => new
                {
                    BranchName = x.FirstOrDefault().BranchName,
                    Name = x.FirstOrDefault().Name,
                    A_Status = x.Max(p => p.A_Status),
                    Currency = x.FirstOrDefault().Currency,
                    NoCart = x.FirstOrDefault().NoCart,
                    NoAccount = x.FirstOrDefault().NoAccount
                }).ToList();
            foreach (var item in students)
            {
                model.Students.Add(new Student
                {
                    A_Status = item.A_Status,
                    BranchName = item.BranchName,
                    Name = item.Name,
                    NoAccount = item.NoAccount,
                    NoCart = item.NoCart,
                    Currency = item.Currency

                });
            }
            return View(model);

        }

现在这个错误,我根据你的回答更新了我的模型和视图(cshtml)。

我的观点(cshtml)

@model Tessa.Models.Model

@{
    ViewBag.Title = "BranchView";
}

<h2>BranchView</h2>

@foreach (var item in Model.Students)
{
    <p>@item.Name</p>
    <p>@item.A_Status</p>
    <p>@item.BranchName</p>
    <p>@item.NoAccount</p>
    <p>@item.NoCart</p>
    <p>@item.Currency</p>
}

【问题讨论】:

  • 疯了!甚至不要考虑它。您有一个方法并向其传递一个参数以指示您要返回哪些数据。并且你可以检查当前用户有什么权限来决定应该显示什么
  • 如果用户可以选择分支名称,则将分支名称作为参数(也许用户可以通过下拉列表选择?)提供给您的操作方法,然后将该值作为参数提供给您的操作方法询问。然后您每次都使用相同的视图和操作方法来获取数据。拥有 25 种几乎相同的方法是疯狂的,并且错过了编程的基本要点之一——即接受和使用用户输入来更改代码的行为。除此之外,如果有人将另一个分支添加到表中,您不想编写更多代码来访问它,那真是太疯狂了。
  • @ADyson 你好,我在下面的回答中实现了方法,现在我的步骤是授予一个用户查看权限,例如名称为“Branch_1”的分支(localhost/students/Test01/Branch_1)对?
  • @whitefang 如果您有新问题,请提出新问题。评论不是讨论要添加到代码中的新功能的地方。问一个新问题,展示你到目前为止所做的事情以及你正面临的问题。谢谢。

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


【解决方案1】:

正如 cmets 所写,您不必为每个分支都这样做。这是一个可以帮助您的解决方案

你的控制器

        public ActionResult Branch(string branchname)
    {
        var db = new ApplicationDbContext();
        var model = new Model();

        var students = db.Students
                                  .Where(x => x.BranchName == branchname)
                                  .GroupBy(x => new { x.BranchName, x.Name, x.Currency, x.NoCart, x.NoAccount })
                                  .Select(x => new
                                  {
                                      BranchName = x.FirstOrDefault().BranchName,
                                      Name = x.FirstOrDefault().Name,
                                      A_Status = x.Max(p => p.A_Status),
                                      Currency = x.FirstOrDefault().Currency,
                                      NoCart = x.FirstOrDefault().NoCart,
                                      NoAccount = x.FirstOrDefault().NoAccount
                                  }).ToList();

        foreach (var item in students)
        {
            model.Students.Add(new Student
            {
                A_Status = item.A_Status,
                BranchName = item.BranchName,
                Name = item.Name,
                NoAccount = item.NoAccount,
                NoCart = item.NoCart,
                Currency = item.Currency
            });
        }

        return View(model);
    }

因此,您只需将分支名称传递给控制器​​。她有几种不同的方法来做到这一点。

将模型传递给视图是一种很好的做法。

public class Model
{
     public List<Student> Students { get; set; }

    //Some other propertys

    public Model()
    {
        Students = new List<Student>();
    }
}

最后你可以这样写你的视图

@model TestApp.Models.Model 

@{
    ViewBag.Title = "BranchView";
}

<h2>BranchView</h2>

@foreach (var item in Model.Students)
{
    <p>@item.Name</p>
    <p>@item.A_Status</p>
    <p>@item.Branchname</p>
    <p>@item.NoAccount</p>
    <p>@item.NoCart</p>
    <p>@item.Currency</p>
}

foreach-loop 中,您可以执行普通的 html 内容。这将针对列表中的每个元素完成。

希望对你有所帮助。

【讨论】:

  • 我被你的控制器卡住了)不知道)
  • 新“模型”var model = new Model 后单词错误
  • 找不到类型或命名空间名称“模型”(您是否缺少 using 指令或程序集引用?)
  • @whitefang 你需要创建一个新的类,通常你称之为以前缀模型结尾的东西。例如 EnrollmentStudentGroupsModel 或类似的东西。在示例中,我只给出模型名称。
  • 接下来我做了 (var model = new EnrollmentStudentGroup)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多