如何提交值,但从输入字段接收键 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...
}
结果:
我的操作参数中收到了一个 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...
}
结果: