【发布时间】:2019-09-05 11:20:24
【问题描述】:
我想看某种媒体类型的电影(即 DVD、蓝光、VHS),所以我创建了存储过程来做到这一点。此存储过程返回具有与媒体类型关联的 ID 的电影。例如,ID 1 返回 DVD。我的媒体类型有一个页面,其中列出了媒体(剃须刀页面在搭建脚手架后自动为我创建了详细信息页面)。
- 我的存储过程代码如下:
using System;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Movies.Models
{
public class MovieDataAccessLayer
{
string connectionString = "Server=ServerName;Database=DatabaseMovies;Trusted_Connection=True;MultipleActiveResultSets=true";
public IEnumerable<Movies> MovieByMedia(byte? MediaID)
{
List<Movies> lstmovie = new List<Movies>();
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("usp_MovieByMedia", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Movies movies = new Movies();
movies.MovieTitle = rdr["MovieTitle"].ToString();
movies.MovieYear = Convert.ToInt32(rdr["MovieYear"]);
lstmovie.Add(movies);
}
con.Close();
}
return lstmovie;
}
}
}
- 这是我的媒体详细信息 .cshtml.cs 代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Movies.Models;
namespace Movies.Pages.MediaDetails
{
public class DetailsModel : PageModel
{
private readonly Movies.Models.MoviesContext _context;
public DetailsModel(Movies.Models.MoviesContext context)
{
_context = context;
}
public Media Media { get; set; }
public async Task<IActionResult> OnGetAsync(byte? id)
{
if (id == null)
{
return NotFound();
}
Media = await _context.Media.FirstOrDefaultAsync(m => m.MediaTypeID == id);
if (Media == null)
{
return NotFound();
}
return Page();
}
}
}
- 这是我的 .cshtml 页面
@model Movies.Pages.MediaDetails.DetailsModel
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Media</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Media.MediaType)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Media.MediaType)
</dd>
</dl>
</div>
<div>
<a asp-page="./Edit" asp-route-id="@Model.Media.MediaTypeID">Edit</a> |
<a asp-page="./Index">Back to List</a>
</div>
- 这是我的电影详细信息 .cshtml 的代码,我尝试连接到我的媒体 .cshtml 但没有成功
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Movies.Models;
namespace Movies.Pages.MovieDetails
{
public class DetailsModel : PageModel
{
private readonly Movies.Models.MoviesContext _context;
public DetailsModel(Movies.Models.MoviesContext context)
{
_context = context;
}
MovieDataAccessLayer objmovie = new MovieDataAccessLayer();
public Movies
Movies { get; set; }
public async Task<IActionResult> OnGetAsync(byte id)
{
Movies = await _context.Movies.FirstOrDefaultAsync(m => m.MediaTypeID == id);
if (Movies == null)
{
return NotFound();
}
return Page();
}
}
}
我想修改列出我的媒体类型的详细信息页面,以便当我单击相应媒体类型的“详细信息”时,我可以为我单击的媒体类型生成存储过程的结果。例如,当我单击“DVD”时,我的存储过程被执行以只显示我的 DVD。我该怎么做呢?我知道我必须以某种方式引用我的电影数据访问层来执行我的 SP。任何帮助将不胜感激。
【问题讨论】:
-
你在
GenreID方法中作为参数使用MovieByGenre()但你没有使用它,这是一个错字吗?MovieByGenre()当前是否也返回数据库中的所有电影? -
感谢您指出这一点,Izzy。这是一个错字。我开始使用 GenreID 进行我的程序,但这会有点复杂,所以我切换到 MediaID 并且没有更新它。对困惑感到抱歉。它也应该是 MovieByMedia()。此过程返回某个 mediaID 的所有电影。因此,例如,MediaID 为 1 将返回所有 DVD 电影。
-
但是您没有将 id 作为参数传递给 sproc,所以我对过滤是否完成感到困惑。同样在您的
OnGetAsync操作中不应该是Movies = objmovie.MovieByGenre(id).FirstOrDefault(i => i.MediaTypeID == id);吗?当然,如果在数据库中完成过滤,则此处不需要FirstOrDefault,您必须创建一个单独的方法,在其中返回单个Movies对象 -
这是我不明白的一部分。我如何以及在何处传递参数以说“当我单击 DVD 时,将参数 1 传递给此存储过程”?我想我应该在 Media Details .cshtml 页面上这样做,但我不确定。我是 .Net 的新手,我正在尝试将其拼凑起来。
-
您想在数据库或应用程序中进行过滤吗?因为你有两种方法可以解决你的问题。
标签: asp.net tsql stored-procedures razor razor-pages