微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#|如何将参数从“视图”传递到DAL通过图层

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?