ASP.NET MVC C#教程:如何在用户输入进入数据库之前编辑/检查用户输入?

时间:2017-08-31 00:12:54

标签: c# asp.net-mvc entity-framework

我一直在研究Microsoft官方教程,旨在教授使用C#ASP.NET核心MVC(https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/crud)。我有使用C ++和Java等OOP语言的经验,但我是C#和这个特定框架的新手。

教程本身运作良好;我有一个Web应用程序,可以对学生进行基本的CRUD操作。就我的目的而言,重要的是要知道学生有一个LastNameFirstName和一个唯一的,自动生成的ID,它在数据库中作为主键。

我想添加一张支票,以确保学生的姓氏和名字的组合是唯一的。我还希望能够通过删除前导空格等来清理输入。我能够通过在Create方法中创建新数据来实现这一点,但是我对于如何添加此数据感到很遗憾到控制器中推荐的Edit方法(我已经修剪了我所知道的所有内容并不重要,以节省空间):

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> EditPost(int? id) 
{
    var studentToUpdate = await _context.Students.SingleOrDefaultAsync(s => s.ID == id);

    if (await TryUpdateModelAsync<Student>(
        studentToUpdate,
        "",
        s => s.FirstMidName, s => s.LastName))
    {
        try
        {
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
    }

    return View(studentToUpdate);
}

问题:如何在将用户数据放入数据库之前对其进行检查和操作?

从我能够挖掘的内容来看,TryUpdateModelAsync函数以某种方式获取用户提交的信息并使用它来更新模型。但是,文档并没有给我任何线索如何进行干预并成为该过程的积极参与者。在允许更新之前,我想自己检查/操作数据,但我不确定如何访问它。它在一个对象中吗?有没有一个功能可以让我对它进行操作?经过一整天的谷歌搜索,我还没有找到它。我确信它一定是可能的,因为将未经过处理的数据从用户新鲜放入数据库似乎不是一个好习惯。 (至少那是我从Bobby Tables听到的)

视图中的输入示例,如果有帮助:

<div class="form-group">
    <label asp-for="FirstName" class="control-label"></label>
    <input asp-for="FirstName" class="form-control" />
    <span asp-validation-for="FirstName" class="text-danger"></span>
</div>

我希望我提供了足够的信息;如果我遗漏了任何重要的背景,请告诉我。

2 个答案:

答案 0 :(得分:0)

学生数据位于“studentToUpdate”中。你可以像这样读写它。

studentToUpdate.firstName = "anything"
var fullName = studentToUpdate.firstName + " " + studentToUpdate.lastName
if (studentToUpdate.lastName == "anything")
{
    //Do anything here
}

请注意,您似乎正在阅读数据库并再次保存数据而不从表单中发布任何内容。您的控制器混合了HTTP GET和HTTP POST。请查看本教程:

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/crud

另外,为了验证输入数据,我建议您使用模型验证属性。请查看本教程:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation

答案 1 :(得分:0)

关于验证部分,您应该使用模型验证属性。在您的具体示例中,如果您的学生已经存在,则必须检查数据库:

在ViewModel中:

@using System.Web.Mvc

//your model properties

[Remote("CheckStudentNameAlreadyExists", "Validation", ErrorMessage = "This student already exists")]
public string StudentName {get; set;}

然后,只需在ValidationController中编写一个方法,根据您自己的业务规则检查学生是否已经存在

public JsonResult CheckStudentNameAlreadyExists(string studentName)
{
    bool isNameAvailable = /* method checking your DB */
    return Json(isNameAvailable , JsonRequestBehavior.AllowGet);
}

关于修改部分,您的EditPost操作应将viewModel作为参数,以便您可以“即时”修改数据。