Есть ли способ отправить значения, не содержащиеся в полях ввода, как часть формы в ASP.NET ?

#c# #asp.net-core-mvc

#c# #asp.net-core-mvc

Вопрос:

Я хочу изменить значения в модели, используемой в форме, но я не хочу разрешать изменять все значения. Например (код sudo)

Модель: Пользователь

 Id : Guid
Name : string
Address : string
Username : string
 

Вид

 <form action="Save">
  <input value=Model.Name />
  <input value=Model.Address />
  <input value=Model.Username />
  <button type="submit">Submit</button>
</form>
 

Исходя из этого, я хочу, чтобы метод сохранения мог принимать пользовательскую модель в качестве параметра и содержать идентификатор исходной модели, возможно ли это сделать в ASP.NET ?

Контроллер

 public IActionResult Save(User model) {
   // Save model changes based on original Id value
   return View(model);
}
 

Ответ №1:

У вас есть несколько способов добиться этого, которые лучше всего выполняются на стороне сервера:

Давайте предположим, что у нас есть такая модель:

1- Вы могли бы привязать конкретные свойства, которые вы хотите иметь возможность изменять, это выглядело бы примерно так:

 public class Person
{
    public string Id { get; set; }
    public string Description { get; set; }
    public string Name{ get; set; }
    public int Age { get; set; }
}


    public async Task<IActionResult> Edit([Bind("Id,Name,Description")] YourModel model)
    {
       //Here only the properties Id, Name and Description would be populated
       //it wont matter if there are any other properties they will be ignored
    }
 

2 — Другим способом было бы вручную выбрать, какие свойства изменять, чтобы вернуться к модели

    public async Task<IActionResult> Edit(YourModel model)
    {
      YourModel original; //Get it from database!
      original.Name = model.Name;
      //Here save changes and it will only modify the name
    }
 

3 — Другим способом было бы явно указать вашему ORM, если вы используете какой-либо, что вы не хотите изменять это конкретное свойство

В интерфейсе вы можете добиться этого, отключив эти свойства, сделав их доступными только для чтения, но это не очень хороший подход, поскольку пользователь может изменить его из инспектора.

Комментарии:

1. Привет, Налнпир, спасибо за ответ на это, я полностью согласен с тем, чтобы контролировать это из серверной части, я думаю, вы неправильно поняли мое намерение по вопросу, однако меня беспокоит, как я могу YourModel заполнить идентификатор исходной модели? Поскольку значения, которые я отправляю из формы, не содержат свойства Id? Я предполагаю, что в методе «Редактировать» я могу объединить результаты формы и значения модели, которые я сохранил?

2. <input asp-for="Model.Id" type="hidden" /> если только идентификатор не является также параметром маршрута / действия.

3. Это имеет смысл как вариант, это не параметр маршрута нет, разве это не просто добавление ненужного html? Я имею в виду, если это единственное решение, то нет, я думаю, это не так 🙂

4. Нет, это не добавление ненужного html, например, вы, возможно, можете создать какой-нибудь пользовательский контроллер, например [HttpGet(«/ api / v1/ edit/{Id}»)], поэтому у вас может быть параметр Id, который поступает из URL, поэтому ваше действие должно быть нацелено на это. Но другого пути нет. Примите во внимание, что эти подходы должны быть проверены серверной частью, поскольку пользователь может изменить скрытое значение, а также действие маршрута