如何提交值,但从输入字段接收键 ASP.NET Core MVC

How to Submit Value, but Receive Key from Input field ASP.NET Core MVC

我的操作参数中收到了一个 ID。从那里我得到了我的计划细节。通过这些细节,我找到了我想要的方案名称。现在我想在我的 .cshtml 中将此名称显示为输入字段,我想在其中以 "read-only" 格式(不可更改)显示值。所以在我的控制器中,我将它发送到 ViewData 而不是 SelectList 中,如下所示:

 ViewData["SchemeNum"] = schemeInfo.SchemeNum;

而不是

ViewData["SchemeInfoId"] = new SelectList(_context.PackagewiseSchemeInfo.Where(p => p.Id == id), "Id", "SchemeNum", schemeInfo.SchemeNum);

我知道如果我使用选择列表,我会更容易在如上所述提交表单后捕捉到 Key -- "Id"、"SchemeNum" ...

HTML:

<input  class="form-control" value="@ViewBag.SchemeNum" readonly />

现在,我在提交表单后得到 SchemeNum 而不是 Id。我想知道如何通过输入标签捕获 KEY 而不是值?请帮忙。

您可能想禁用您的输入,为 id 添加一个隐藏字段。

<input class="form-control" value="@ViewBag.SchemeNum" disabled />
<input type="hidden" value="@ViewBag.SchemeId" />

此外,您可以自定义Model Binder来获取value匹配的key。

这是一个像下面这样的工作演示:

型号:

public class PackagewiseSchemeInfo
{
    public int Id { get; set; }
    public string SchemeNum { get; set; }
}

查看:

@model PackagewiseSchemeInfo
<form asp-action="Test">
    <input asp-for="SchemeNum" class="form-control" value="@ViewBag.SchemeNum" readonly />
    <input type="submit" value="create" />
</form>

自定义模型活页夹:

public class CustomModelBinder : IModelBinder
{
    private readonly YourDbContext _context;
    public CustomModelBinder(YourDbContext context)
    {
        _context = context;
    }

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        var data = bindingContext.ActionContext.HttpContext.Request.Form["SchemeNum"];
        var model = _context.PackagewiseSchemeInfo.Where(a => a.SchemeNum == data.ToString())
                                                  .Select(a=>a.Id).FirstOrDefault();
        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

控制器:

public IActionResult Index()
{
    var schemeInfo = new PackagewiseSchemeInfo()
    {
        Id = 1,
        SchemeNum = "aaa"
    };
    ViewData["SchemeNum"] = schemeInfo.SchemeNum;
    return View();
}
[HttpPost]
public IActionResult Test([ModelBinder(typeof(CustomModelBinder))]int Id)
{
     //do your stuff...
}

结果: