#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 является правильным решением. В противном случае вам придется установить все свойства имени вручную, как в моем ответе.