【发布时间】:2021-02-21 09:57:19
【问题描述】:
我正在做一个项目,我需要让用户选择键入他们最想要的角色类型(可以是防御、进攻、侦察、支持)。
他们在我的视图中的文本字段中键入的那个字符串应该被转换(我认为在我的控制器中)为一个参数。这个参数可以传递给我的 DAL 层(通过我的逻辑层)。在我的 DAL 层中,我可以将参数放入我的 getcharacter 方法中,以便用户仅获取数据库中输入与字符类型相同的字符。
(注意:在代码中你会看到 Karakter 而不是 Character。那是因为那是荷兰语)
这是我的数据库:
我的 DAL:
public IEnumerable<IKarakter> GetSortedKarakters(string inputKarakterSoort)
{
using (SqlConnection connection = GetConnection())
{
connection.Open();
var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = @inputKarakterSoort ORDER BY NEWID();", connection);
command.Parameters.Add("@inputKarakterSoort", SqlDbType.VarChar).Value = inputKarakterSoort;
var reader = command.ExecuteReader();
var sortedKarakters = new List<IKarakter>();
while (reader.Read())
{
var karakter = new KarakterDTO
{
KarakterId = (int)reader["KarakterId"],
KarakterSoort = reader["KarakterSoort"]?.ToString(),
KarakterNaam = reader["KarakterNaam"]?.ToString()
};
sortedKarakters.Add(karakter);
}
return sortedKarakters;
}
}
我的逻辑层:
public class SortedKarakterLogic : ISortedKarakterLogic
{
private ISortedKarakterContext sortedKarakterContext { get; }
public SortedKarakterLogic(ISortedKarakterContext sortedContext)
{
sortedKarakterContext = sortedContext;
}
public IEnumerable<IKarakter> GetSortedKarakters(string inputKarakterSoort)
{
return sortedKarakterContext.GetSortedKarakters(inputKarakterSoort);
}
}
我的视图层:
我的控制器:
public class SortedKaraktersController : Controller
{
private readonly ISortedKarakterLogic _sortedKarakterLogic;
public SortedKaraktersController()
{
_sortedKarakterLogic = ApexFactory.ApexFactory.GetSortedKarakterLogic();
}
public IActionResult Index()
{
return View();
}
public ActionResult SortedKarakter(string karakterSoort)
{
var sortedKarakters = _sortedKarakterLogic.GetSortedKarakters(karakterSoort);
var _sortedKarakters = new List<KarakterViewModel>();
foreach (var karakter in sortedKarakters)
{
_sortedKarakters.Add(new KarakterViewModel
{
KarakterId = karakter.KarakterId,
KarakterNaam = karakter.KarakterNaam,
KarakterSoort = karakter.KarakterSoort
}) ;
}
return View(_sortedKarakters);
}
}
我的 cs.html:
using (Html.BeginForm("SortedKarakter", "SortedKarakters"))
{
<input type="text" name="karakterSoort" />
<input type="submit" />
}
我运行时得到的错误是:
SqlException: SqlException: SqlException: The parameterized query '(@inputKarakterSoort varchar(8000))SELECT TOP 2 * FROM Karakter ' expects the parameter '@inputKarakterSoort', which was not supplied.
我知道这个错误位于我的 DAL 中,但我不知道是否需要在我的 DAL 中修复它,因为我试图将 GetSortedKarakters 类的参数(在我的 DAL 中)设置为这样的字符串:
public IEnumerable<IKarakter> GetSortedKarakters(string inputKarakterSoort)
{
inputKarakterSoort = "Defensive"
数据库只返回防御性为字符类型的字符(或数据库中的 KarakterSoort),这正是我想要的。
所以评论建议我在控制器中放一个断点,看看我的参数 karakterSoort 是否为空,它是。
我应该更改什么(可能在我的 cs.html 中)以便它传递文本框中给出的值而不是 null?
【问题讨论】:
-
你试过调试看看
inputKarakterSoort的值是多少?我最好的猜测是你可能传递了一个空值。 -
你的权利!我该怎么办?
-
您对我的 cs.html 使用什么视图并向我们展示您获得的操作。
标签: c# asp.net-core razor controller n-tier-architecture