如何解决C#|如何将参数从“视图”传递到DAL通过图层
我正在做一个项目,在该项目中,我需要让用户选择键入他们最想要的角色(可以是防御性,进攻性,侦察性,支持性)。
他们在我的视图中的文本字段中键入的字符串应转换为参数(我认为是在控制器中)。这个参数可以通过我的逻辑层传递到我的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);
}
}
我的VieuwLayer:
我的控制器:
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?
解决方法
创建viewModelClass:
public class InputKarakterSoortViewModel
{
public string InputKarakterSoort {get; set;}
}
创建行动
[Route("~/SortedKarakter/GetInputKarakterSoort")]
public ActionResult GetInputKarakterSoort ()
{
var viewModel= new InputKarakterSoortViewModel{InputKarakterSoort = "Defensive"};
return View(viewModel);
}
使用此代码进行查看
@model InputKarakterSoortViewModel
......
using (Html.BeginForm("SortedKarakter","SortedKarakters"))
{
<input type="text" asp-for="InputKarakterSoort" name="InputKarakterSoort" />
<input type="submit" />
}
并更改您的操作代码:
public ActionResult SortedKarakter([FromForm] InputKarakterSoortViewModel viewModel)
{
var karakterSoort = viewModel.InputKarakterSoort;
.........
.......
}
还有几种更简单的方法,但是您必须使用javascript ajax代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。