MaskedTextBoxFor теряет значение после отправки представления MVC Razor
После отправки формы в контроллер входы MaskedTextBoxFor теряют свои значения, если представление возвращается из контроллера, в то время как все другие значения (textboxdor, dropdownlistfor) остаются в том виде, в котором они были отправлены. Итак, как сделать так, чтобы значения MaskedTextBoxFor оставались, когда отправленное представление возвращается из контроллера? Заранее спасибо...
Просмотр (обновление):
@model EurodeskMultipliers.Domain.Entities.Multiplier
@using (Html.BeginForm("Create", "Multiplier", FormMethod.Post,
new { id = "createForm", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="container">
<fieldset>
<section>
<div class="legend-left">
@Html.LabelFor(m => m.Phone)
@(Html.Kendo().MaskedTextBoxFor(m => m.Phone).Mask("(0999) 000 00 00"))
@Html.ValidationMessageFor(m => m.Phone)
<br />
@Html.LabelFor(m => m.ContactPhone)
@(Html.Kendo().MaskedTextBoxFor(m => m.ContactPhone).Mask("(0999) 000 00 00"))
<br />
@Html.LabelFor(m => m.ContactMobile)
@(Html.Kendo().MaskedTextBoxFor(m => m.ContactMobile).Mask("(0999) 000 00 00"))
@Html.ValidationMessageFor(m => m.ContactMobile)
<br />
</div>
</section>
</fieldset>
<div class="dv-right">
@(Html.Kendo().Button()
.Name("submitbtn")
.Content("Save")
)
</div>
</div>
}
контроллер:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude = null)] Multiplier multiplier)
{
try
{
if (ModelState.IsValid)
{
return View(); //FOR TESTING "MaskedTextBox"
db.Multipliers.Add(multiplier);
db.SaveChanges();
return RedirectToAction("Completed");
}
}
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.)
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
return View(multiplier);
}
Модель:
public class Multiplier
{
public int ID { get; set; }
[Required(ErrorMessage = "Required")]
[RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")]
[MaxLength(20)]
[Display(Name = "Phone")]
public string Phone { get; set; }
[Required(ErrorMessage = "Required")]
[RegularExpression(@"\([0-9]{4}\) [0-9]{3} [0-9]{2} [0-9]{2}", ErrorMessage = "Check phone number.")]
[MaxLength(20)]
[Display(Name = "Mobile Phone")]
public string ContactMobile { get; set; }
//Navigation property
public virtual InstituteStatus InstituteStatus { get; set; }
[ForeignKey("TermID")]
public virtual Lookup Lookup { get; set; }
//Collection navigation property
public virtual ICollection<Participant> Participants { get; set; }
//For using two Foreign Key on the same (Multiplier) table
[ForeignKey("MultiplierCityID")]
[InverseProperty("MultiplierCityMultipliers")]
public virtual City MultiplierCity { get; set; }
[ForeignKey("ContactCityID")]
[InverseProperty("ContactCityMultipliers")]
public virtual City ContactCity { get; set; }
}
5 ответов
Наконец, я вижу, что использование @Html.TextBoxFor() с опцией класса "k-textbox" решило проблему, и может возникнуть проблема, связанная с Html.Kendo().MaskedTextBox(). Поскольку все то же самое, за исключением этого и так, для тех, кто может столкнуться с проблемой, я разместил последний статус поля ниже. С другой стороны, большое спасибо @jumpingcode, OnaBai и @mmillican за их любезную помощь. Я проголосовал за их ответы.
@Html.LabelFor(m => m.Phone)
@Html.TextBoxFor(m => m.Phone, new { maxlength = 13, @class = "k-textbox", placeholder = "+49xxxxxxxxxx" })
@Html.ValidationMessageFor(m => m.Phone)
Если вы посмотрите на ASP.NET MVC
пример по телерику тут. Вы увидите, что вы используете MaskedTextBoxFor
скорее, чем MaskedTextBox
, Вот пример кода с сайта:
@(Html.Kendo().MaskedTextBox()
.Name("phone_number")
.Mask("(999) 000-0000")
.Value("555 123 4567")
)
Здесь вы хотите заменить .Name("phone_number")
с .Name("Phone")
У меня была та же проблема с одной из моих форм. Похоже, что расширение бритвы MaskedTextBoxFor не смотрит на значения в ModelState. Таким образом, если проверка не пройдена и форма перезагружается, часть формы будет заполнена заново, а номера телефонов - нет.
Поэтому я просто использовал обычный @Html.TextBoxFor, но добавил маску кендо вручную через javascript, и она работала нормально.
У меня была такая же проблема с MaskTextBox, но, к счастью для меня, я столкнулся с подобной проблемой с не связанной проблемой. Мой maskedtextbox был для поля Phone Number, которое я поместил в шаблон редактора.
@model string
@(Html.Kendo()
.MaskedTextBox()
.Name(Html.IdForModel().ToString())
.Mask("000-000-0000")
.Deferred())
В предыдущей проблеме я решил ее, посмотрев в состояние модели для модели и выяснив, имеет ли она значение попытки (из-за неудачной проверки). Затем, если это так, я устанавливаю значение параметра MaskedTextBox. Обновленный шаблон редактора приведен ниже.
@model string
@{
string attemptedValue = "";
ModelState modelStateForValue = Html.ViewData.ModelState[Html.IdForModel().ToString()];
if (modelStateForValue != null)
{
attemptedValue = modelStateForValue.Value.AttemptedValue;
}
}
@(Html.Kendo()
.MaskedTextBox()
.Name(Html.IdForModel().ToString())
.Mask("000-000-0000")
.Value((!string.IsNullOrEmpty(attemptedValue)) ? attemptedValue : "")
.Deferred())
Надеюсь это поможет.
В вашем фрагменте кода контроллера в исходном вопросе у вас есть следующая строка:
return View(); //FOR TESTING "MaskedTextBox"
Значение не привязано к MultiSelectFor()
потому что вы не передаете модель обратно в представление. Если вы измените его на следующее, оно должно работать:
return View(multiplier);