Ошибка имени текстовых полей, исходящая из Viewmodel в форме MVC

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

я использую ViewModel в текстовых полях, но имя полей модели не является актуальным в viewsource браузера. в viewsource браузера отображается имя поля модели с именем viewmodel, например name=»ResetPasswordModel.NewPassword», а также идентификатор поля отображаются как имя, так как я могу это исправить. я добавил исходный код браузера и фактический код, пожалуйста, просмотрите его. надеюсь, вы поняли мой вопрос, спасибо.

ViewModel

 public class ProductViewModel
{
    public User UserDetails { get; set; }        
    public ResetPasswordModel ResetPasswordModel { get; set; }
}

public class ResetPasswordModel
{
  public string CurrentPassword{ get; set; }
  public string NewPassword { get; set; }

}
  

Вид

 @model ProjectName.Models.ProductViewModel

    @using (Html.BeginForm("ActionName", "Controller", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.UserDetails.UserID)
    <div class="row">
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">Current Password</label>
                @Html.TextBoxFor(model => model.ResetPasswordModel.CurrentPassword, new { @class = "form-control", placeholder = "Current Password" })
                @Html.ValidationMessageFor(model => model.ResetPasswordModel.CurrentPassword, "", new { @class = "text-danger" })

            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">New Password</label>
                @Html.TextBoxFor(model => model.ResetPasswordModel.NewPassword, new { @class = "form-control", placeholder = "New Password" })
                @Html.ValidationMessageFor(model => model.ResetPasswordModel.NewPassword, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
}
  

Источник просмотра браузера

вы можете видеть, что они не отображают имена полей модели, верно

 <div class="col-sm-6">
    <div class="form-group">
        <label class="control-label">Current Password</label>
        <input class="form-control" name="ResetPasswordModel.CurrentPassword" placeholder="Current Password" data-val="true" data-val-required="The Current Password field is required." id="ResetPasswordModel_CurrentPassword"  type="text" value="" />
        <span class="field-validation-valid text-danger" data-valmsg-for="ResetPasswordModel.CurrentPassword" data-valmsg-replace="true"></span>

    </div>
</div>
<div class="col-sm-6">
    <div class="form-group">
        <label class="control-label">New Password</label>
        <input class="form-control" name="ResetPasswordModel.NewPassword" 
placeholder="New Password" id="ResetPasswordModel_NewPassword" type="text"  data-val="true" data-val-maxlength="Maxmimum 40 characters allowed" data-val-maxlength-max="40" data-val-minlength="Minimum 8 characters required for password" data-val-minlength-min="8" data-val-required="The Password field is required"  value="" />
        <span class="field-validation-valid text-danger" data-valmsg-for="ResetPasswordModel.NewPassword" data-valmsg-replace="true"></span>
    </div>
</div>
  

Контроллер

     [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ActionName(ResetPasswordModel ResetPass)
    {
        if (ModelState.IsValid)
        {

        }
        return View();
    }
  

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

1. Если имя поля не является «правильным», чего вы ожидаете? Является ли текущее имя проблемой и получаете ли вы ошибки? Какие именно ошибки (если есть)?

2. Я не понимаю, в чем здесь проблема, атрибут name для ввода: ResetPasswordModel. NewPassword, и это правильно. Пожалуйста, поясните, почему это проблема? и каково желаемое поведение.

3. имя поля @Jasen должно быть NewPassword, а не ResetPasswordModel. NewPassword, потому что он добавляет дополнительный ResetPasswordModel, и, как и в моей модели, это также NewPassword.

4. @HoomanBahreini но в моей ResetPasswordModel это только NewPassword, см. Модель выше. и из-за этой проблемы я не получаю свои входные данные из представления в контроллер.

5. @AsifShakir: Вы имеете в виду, что имя должно быть: NewPassword вместо ResetPasswordModel. Новый пароль?

Ответ №1:

Проблема в том, что, по вашему мнению, ваша модель: ProductViewModel , но в вашем контроллере вы ожидаете: ResetPasswordModel .

Это неправильно, либо измените контроллер на accept: ProductViewModel

 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ActionName(ProductViewModel productViewModel)
{
    if (ModelState.IsValid)
    {

    }
    return View();
}
  

В этом случае это ввод с именем=ResetPasswordModel .NewPassword будет правильно привязан к вашей модели.

Или измените модель в вашем представлении:

 @model ResetPasswordModel

@using (Html.BeginForm("ActionName", "Controller", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.UserDetails.UserID)
    <div class="row">
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">Current Password</label>
                @Html.TextBoxFor(model => model.CurrentPassword, new { @class = "form-control", placeholder = "Current Password" })
                @Html.ValidationMessageFor(model => model.CurrentPassword, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">New Password</label>
                @Html.TextBoxFor(model => model.NewPassword, new { @class = "form-control", placeholder = "New Password" })
                @Html.ValidationMessageFor(model => model.NewPassword, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
}
  

В этом случае входное имя будет: NewPassword

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

1. решил мою проблему с помощью этого ответа. @Html.TextBoxFor(модель => модель. Сбросьте passwordmodel. NewPassword, new { @class = «form-control», заполнитель = «Новый пароль», Name=»NewPassword»})

2. То, что вы делаете, — это взлом… вы должны использовать одну и ту же модель в контроллере и представлении … вот как MVC предназначен для использования.

3. на мой взгляд, мне также нужны пользовательские данные, что я должен сделать для пользовательских данных?

4. используется ProductViewModel как в контроллере, так и в представлении. и не меняйте автоматически сгенерированное имя…

5. если я не изменю имя, я не получаю данные из представления в контроллер из-за того, что поле модели не совпадает с текстовым полем name.so что я должен сделать для сопоставления имен?

Ответ №2:

вы можете установить свойство name следующим образом:

 @Html.TextBoxFor(model => model.ResetPasswordModel.NewPassword, new { @class = "form-control", placeholder = "New Password" , Name="NewPassword"})
  

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

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

2. Вероятно, ему также нужен объект UserDetails в представлении. Поэтому я не думаю, что изменение модели представления является правильным решением.

3. @bthn да, вы правы, мне также нужны пользовательские данные.

4. Хм, изменение модели представления не является хорошим решением, но @HoomanBahreini прав. Я думаю, что обновление модели вашего действия до ProductViewModel является правильным решением. В противном случае вам придется установить все свойства имени вручную, как в моем ответе.