【问题标题】:C# | How to pass a parameter from View to DAL (via layers)C# |如何将参数从视图传递到 DAL(通过层)
【发布时间】: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


【解决方案1】:

创建视图模型类:

 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 代码。

【讨论】:

  • 在 ActionResult GetInputKarakterSoort 中,您将 InputKarakterSoort 设置为等于字符串防御性,而它应该等于用户输入,而不是我设置的值。我该怎么做?
  • 此设置使“防御”作为 InputKarakterSoort 的默认值。创建视图时,它将是一个值或 。用户然后可以改变它或离开它。或者,如果您希望用户获得空输入,则只需删除 InputKarakterSoort = "Defensive"。
猜你喜欢
  • 2011-06-04
  • 2013-01-08
  • 1970-01-01
  • 2019-08-25
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2018-07-10
相关资源
最近更新 更多