绑定asp.net核心mvc中的隐藏字段

时间:2017-12-14 15:17:08

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

我正在使用asp.net core 2.0 mvc编写应用程序。

这是我控制者的一个动作:

    [HttpPost]
    public async Task<IActionResult> MyAction(long id, [Bind("id_person,name")] Person p)
    {
        ViewBag.message = "";
        if (p.name == "")
        {
            ViewBag.message = "You need to set name.";
        }
        else if (ModelState.IsValid == false)
        {
            ViewBag.message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage));
        }
        else
        {
            mydb_context.Update(p);
            await mydb_context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(p);
    }

这是相关的cshtml剃刀视图:

@model myproject.Person

<form asp-action="MyAction">
    <div>@ViewBag.message</div>
    <input type="hidden" asp-for="id_person" />
    <input asp-for="name" />
    <input type="submit">
</form>

一切正常:此操作非常适合插入和更新人员。

现在,假设我的Person实体中有第三个字段。例如“年龄”。

我希望这个字段是秘密的。这意味着我不想让用户在他的浏览器中看到这些信息。我也不希望将此信息放在隐藏字段中,因为用户可能会看到或更改信息。

我的问题是如果我按原样保留MyAction和cshtml视图,则当用户更新某个人时,将age设置为null。我希望年龄在数据库中保持其实际价值。

有基本的方法吗? 我不想在MyAction方法中手动设置getter和setter,因为我有很多字段。我想使用Binding。

由于

1 个答案:

答案 0 :(得分:0)

我不知道它在EFCore中是否仍然可用,但是我曾经在EF6中这样做。

如果只想更新名称属性,则可以使用mydb_context.Entry()

var person = mydb_context.Person.FirstOrDefault(p => p.id_person == id);

if(person != null)
{
      mydb_context.Entry(person).Property("name").CurrentValue = "Toto";
      mydb_context.SaveChanges();
}

阅读此内容以获取更多详细信息 https://docs.microsoft.com/fr-fr/ef/ef6/saving/change-tracking/property-values