[asp.net-mvc]验证是目前在 StudentTable 控制器操作中的主键

发布时间: 2017/3/25 12:54:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

当主键作为控制器操作中的参数传递时,我如何可以验证如果传递的 id 在 StudentTable 中存在一个控制器动作?

        public ActionResult LookUpStudentId(string id)
    {

        if(id != //not present in StudentTable)
          return new RedirectResult("~/Error/NotFound");


        return View();

    }

解决方法 1:

你问题的答案将很大程度取决于你所使用来访问您的 SQL 服务器的数据访问技术。因为你还没有告诉我们关于它在这里是如何实现这个平原 ADO.NET 使用︰

public bool IsStudentExists(string id)
{
    using (var conn = new SqlConnection("some connection string"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT id FROM StudentTable WHERE id = @id";
        cmd.Parameters.AddWithValue("@id", id);
        using (var reader = cmd.ExecuteReader())
        {
            return reader.Read();
        }
    }
}

然后:

public ActionResult LookUpStudentId(string id)
{
    if(!IsStudentExists(id))
    {
        return new RedirectResult("~/Error/NotFound");
    }
    return View();
}

这个数据访问代码显然更好要重构在存储库中,以便您的控制器不紧耦合到你所使用的数据访问技术。举个例子你会定义 IStudentsRepository :

public interface IStudentsRepository
{
    Student GetStudent(string id);
}

你然后会执行和现在你的控制器操作可以使用这种抽象︰

public class StudentsController: Controller
{
    private readonly IStudentsRepository _repository;
    public StudentsController(IStudentsRepository repository)
    {
        _repository = repository;
    }

    public ActionResult LookUpStudentId(string id)
    {
        var student = _repository.GetStudent(id);
        if(student == null)
        {
            return new RedirectResult("~/Error/NotFound");
        }
        return View(student);
    }
}

剩下的就是到配置选择你 DI 框架注入控制器恰当地执行这个存储库。

官方微信
官方QQ群
31647020