URL@Context.Request.Query

URL @Context.Request.Query

我想添加 URL @Context.Request.Query 以便 URL 自动填写文本框。但是当我为自动化添加 URL @Context.Request.Query[] 时,哪些列数据会消失。例如,当我自动化 Textbox[Name],[ID] 而不是勾选 IsAccept 并转到 sumbit 时。 [Name] 和 [ID] 列将消失。但如果我取消使用@Context.Request.Query[]。这是正常的。例如,我手动将数据输入到文本框[名称]、[ID],而不是勾选 IsAccept 并转到 sumbit。 [Name] 和 [ID] 列将保留所有数据。

谁能给点建议和帮助?非常感谢!

Controller

public class CheckBoxRequired : ValidationAttribute
         {
             protected override ValidationResult IsValid(object value, ValidationContext validationContext)
             {
                 //get the entered value
                 var student = (UserViewModel)validationContext.ObjectInstance;
                 //Check whether the IsAccepted is selected or not.
                 if (student.IsAccepted == false)
    { 
    return new ValidationResult(ErrorMessage == null ? "Please checked the checkbox" ErrorMessage); 
     }
                 return  ValidationResult.Success;
             }
         }

Controller 

public IActionResult CreateUser()
             {
                 return View();
             }
             [HttpPost]
             public IActionResult CreateUser(UserViewModel user)
             {
                 if (ModelState.IsValid)
                 {
                    //after validation success, create a UserClass instance based on the ViewModel, and insert the "newuser" into database.
                     var newuser = new UserClass();
                     newuser.ID = user.ID;
                     newuser.Name = user.Name;       
                     //save the newuser into the database via dbcontext
                     _dbcontext.UserClass.Add(newuser);
                     _dbcontext.SaveChanges();
                     return RedirectToAction(nameof(Index));
                 }
                 return View();
             }

View:
             @model WebApplication2.Models.UserViewModel

             @{
                 ViewData["Title"] = "CreateUser";
                 Layout = "~/Views/Shared/_Layout.cshtml";
             } 
          <div class="row">
                 <div class="col-md-6">
                     <form asp-action="CreateUser">
                         <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                         <div class="form-group">
                             <label asp-for="ID" class="control-label"></label>
                             <input asp-for="ID" class="form-control"value="@Context.Request.Query["ID"]" />
                             <span asp-validation-for="ID" class="text-danger"></span>
                         </div>
                         <div class="form-group">
                             <label asp-for="Name" class="control-label"></label>
                             <input asp-for="Name" class="form-control" 
    value="@Context.Request.Query["Name"]"/>
                             <span asp-validation-for="Name" class="text-danger"></span>
                         </div>
                         <div class="form-group form-check">
                             <label class="form-check-label">
                                 <input class="form-check-input" asp-for="IsAccepted" /> 
                             </label>
                             <span asp-validation-for="IsAccepted" class="text-danger"></span>
                         </div> 
                         <div class="form-group">
                             <input type="submit" value="Create" class="btn btn-primary" />
                         </div>
                     </form>
                 </div>
             </div> 

Models

public class UserViewModel
 {
     [Required(ErrorMessage = "Entry ID")]
     public int ID { get; set; }
     [Required(ErrorMessage = "Entry Name")]
     public string Name { get; set; } 
     //use custom validation method
     [CheckBoxRequired(ErrorMessage ="Please checked the items")]
     public bool IsAccepted { get; set; } 
 }

根据你在评论中告诉我的,我强烈建议你在控制器中这样做你应该把它改成这样

 [HttpGet]
 public IActionResult CreateUser(string name)
 {
     return View();
 }

那么你有2个选择,

  1. 你填写一个视图模型,然后将它发送到视图,或者选项编号

    [HttpGet]
    public IActionResult CreateUser(string name)
    {
        UserViewModel vm = new UserViewModel { Name = name };
        return View(vm);
    }
    

    在视图中用 value="@Model.Name"

    替换 value="@Context.Request.Query["Name"]"
  2. 你填充viewbag然后在View上消费它

    [HttpGet]
    public IActionResult CreateUser(string name)
    {
        ViewBag.Name = name;
        return View();
    }
    

    在视图中用 value="@(ViewBag.Name as string)"

    替换 value="@Context.Request.Query["Name"]"

在这种特殊情况下,它实际上可以在不转换 ViewBag 的情况下工作,所以它可能只是 value="@ViewBag.Name"

GIF1: https://i.stack.imgur.com/qGrwz.gif

GIF1:当我将 value="@Context.Request.Query["Name"]" 添加到输入 asp-for="Name" class="form-control" 时。 它会导致所有列数据消失。

GIF2 https://i.stack.imgur.com/vGmHU.gif

当我添加 value="@Context.Request.Query["Name"]" 到输入 asp-for="Name" class="form -控制”。 所有列数据应保留

谢谢!